문자열에서 임의의 네이티브명령어를 실행하려면 어떻게 해야 하나요?
나는 다음과 같은 시나리오로 나의 요구를 표현할 수 있다.네이티브 명령으로 실행할 문자열을 받아들이는 함수를 작성합니다.
사내의 다른 커맨드 라인 유틸리티에 접속하고 있는 경우, 커맨드 라인 유틸리티에 의해서, 말 그대로의 커맨드를 실행할 수 있습니다.명령어를 제어하지 않기 때문에 유효한 명령어를 입력으로 받아들여야 합니다.다음은 제가 쉽게 극복할 수 없었던 주요 딸꾹질입니다.
이 명령어는 공백이 있는 경로에 상주하는 프로그램을 실행할 수 있습니다.
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';명령어에는 공백이 있는 파라미터가 포함될 수 있습니다.
$command = 'echo "hello world!"';명령어에는 싱글틱과 더블틱이 모두 포함될 수 있습니다.
$command = "echo `"it`'s`"";
이 일을 해낼 수 있는 깔끔한 방법이 있을까요?지금까지 나는 호화롭고 추악한 회피책만 고안해냈지만 스크립트 언어로는 이것이 매우 간단해야 한다고 생각한다.
Invoke-Expression , , , , , , , .iex예시는
iex $command
exe가 따옴표 안에 있기 때문에 예제 #1과 같이 일부 문자열이 그대로 실행되지 않습니다.문자열의 내용은 Powershell 명령어프롬프트에서 스트링을 직접 실행하는 것과 동일하기 때문에 그대로 동작합니다.
$command = 'C:\somepath\someexe.exe somearg'
iex $command
따옴표 안에 exe의 합니다.&다음 예시와 같이 명령줄에서 실행되도록 합니다.
>> &"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"
그리고 스크립트에서:
$command = '"C:\Program Files\Some Product\SomeExe.exe" "C:\some other path\file.ext"'
iex "& $command"
대부분의 경우 명령 문자열의 첫 번째 문자가 다음과 같은지 여부를 검출함으로써 거의 모든 경우를 처리할 수 있습니다."하다
function myeval($command) {
if ($command[0] -eq '"') { iex "& $command" }
else { iex $command }
}
그러나 다른 방법으로 호출해야 하는 몇 가지 사례가 있을 수 있습니다.때는 ' 쪽이든 쓸 수 '를 사용해야 합니다.try{}catch{}예를 들어 특정 예외 유형 또는 예외에 대해 알아보거나 명령 문자열을 조사합니다.
상대경로가 아닌 절대경로를 항상 수신하는 경우에는 위의 2가지 경우를 제외하고 특별한 경우가 많지 않습니다.
PowerShell을 사용하여 셸 명령을 실행하는 것이 얼마나 어려운지에 대한 Microsoft Connect 보고서도 참조하십시오( 아이러니하게도).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
'쓰다'라는 표현을 쓰라고 .--%PowerShell이 오른쪽 텍스트를 해석하는 것을 멈추도록 강제할 수 있습니다.
예를 들어 다음과 같습니다.
MSBuild /t:Publish --% /p:TargetDatabaseName="MyDatabase";TargetConnectionString="Data Source=.\;Integrated Security=True" /p:SqlPublishProfilePath="Deploy.publish.xml" Database.sqlproj
콜 연산자를 사용하는 경우 인수는 변수에 저장된 배열로 할 수 있습니다.
$prog = 'c:\windows\system32\cmd.exe'
$myargs = '/c','dir','/x'
& $prog $myargs
콜 오퍼레이터는 어플리케이션과 연동한다.정보 객체도 있습니다.
$prog = get-command cmd
$myargs = -split '/c dir /x'
& $prog $myargs
레지스트리에서 언인스톨 문자열을 해석해 실행하려고 했을 때, 받아들여진 회답이 기능하지 않았습니다.알고보니 전화할 필요가 없었어Invoke-Expression결국.
언인스톨 스트링을 실행하는 방법을 확인하려고 드디어 이 멋진 템플릿을 찾았습니다.
$path = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
$app = 'MyApp'
$apps= @{}
Get-ChildItem $path |
Where-Object -FilterScript {$_.getvalue('DisplayName') -like $app} |
ForEach-Object -process {$apps.Set_Item(
$_.getvalue('UninstallString'),
$_.getvalue('DisplayName'))
}
foreach ($uninstall_string in $apps.GetEnumerator()) {
$uninstall_app, $uninstall_arg = $uninstall_string.name.split(' ')
& $uninstall_app $uninstall_arg
}
이것은 나에게 효과가 있다. 즉,$app사내 어플리케이션으로 두 가지 주장만 있을 것으로 알고 있습니다.더 복잡한 제거 문자열의 경우 join 연산자를 사용할 수 있습니다.또한 해시맵을 사용했을 뿐이지만, 실제로는 어레이를 사용하는 것이 좋습니다.
또, 같은 애플리케이션의 복수의 버전이 인스톨 되어 있는 경우, 이 언인스톨러에 의해서, 이러한 애플리케이션이 동시에 순환해 버리기 때문에, 혼란이 생깁니다.MsiExec.exe그것도 있어요.
언급URL : https://stackoverflow.com/questions/6338015/how-do-you-execute-an-arbitrary-native-command-from-a-string
'programing' 카테고리의 다른 글
| WPF ListBox의 ItemTemplate와 ItemContainerStyle의 차이점은 무엇입니까? (0) | 2023.04.24 |
|---|---|
| PowerShell에서 각 명령이 종료될 때까지 기다렸다가 다음 명령을 시작하도록 지시하는 방법은 무엇입니까? (0) | 2023.04.24 |
| WPF 창을 올바르게 폐기하는 방법은 무엇입니까? (0) | 2023.04.24 |
| UICollection View의 셀 간격 (0) | 2023.04.24 |
| 배경에 신속하게 흐림 효과 추가 (0) | 2023.04.24 |