programing

문자열에서 임의의 네이티브명령어를 실행하려면 어떻게 해야 하나요?

sourcejob 2023. 4. 24. 23:09
반응형

문자열에서 임의의 네이티브명령어를 실행하려면 어떻게 해야 하나요?

나는 다음과 같은 시나리오로 나의 요구를 표현할 수 있다.네이티브 명령으로 실행할 문자열을 받아들이는 함수를 작성합니다.

사내의 다른 커맨드 라인 유틸리티에 접속하고 있는 경우, 커맨드 라인 유틸리티에 의해서, 말 그대로의 커맨드를 실행할 수 있습니다.명령어를 제어하지 않기 때문에 유효한 명령어를 입력으로 받아들여야 합니다.다음은 제가 쉽게 극복할 수 없었던 주요 딸꾹질입니다.

  1. 이 명령어는 공백이 있는 경로에 상주하는 프로그램을 실행할 수 있습니다.

    $command = '"C:\Program Files\TheProg\Runit.exe" Hello';
    
  2. 명령어에는 공백이 있는 파라미터가 포함될 수 있습니다.

    $command = 'echo "hello world!"';
    
  3. 명령어에는 싱글틱과 더블틱이 모두 포함될 수 있습니다.

    $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

반응형