2011-07-06 5 views
22

powershell을 사용하면 '&'문자를 사용하여 다른 응용 프로그램을 실행하고 매개 변수를 전달할 수 있습니다.동적으로 명령 줄 명령을 생성 한 다음 powershell을 사용하여 호출하십시오.

간단한 예입니다.

$notepad = 'notepad' 
$fileName = 'HelloWorld.txt' 

# This will open HelloWorld.txt 
& $notepad $fileName 

좋은 결과입니다. 하지만 비즈니스 로직을 사용하여 명령 문자열을 동적으로 생성하려면 어떻게해야합니까? 같은 간단한 예제를 사용 :

$commandString = @('notepad', 'HelloWorld.txt') -join ' '; 
& $commandString 

내가 오류를 얻을 :

The term 'notepad HelloWorld.txt' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

를 내 실제 예제는 동적으로 최종 명령 행 문자열에 옵션을 추가하거나 제거 할 노력하고있어. 이 문제를 해결할 수있는 방법이 있습니까? 이 작업을 수행하는

+0

큰 따옴표 ("") 도움에 인용 하는가? – cristobalito

답변

25

두 가지 방법 : 인수에서 EXE

별도. 이후 인수를 유지하는 변수 정상적으로 EXE 파일을 인수에 대한 모든 동적 물건을 수행하지만, 전화 : 둘 이상의 인수가있는 경우는 별도 될 경우

$argument= '"D:\spaced path\HelloWorld.txt"' 
$exe = 'notepad' 
&$exe $argument 

#or 
notepad $argument 

, 당신은 그것을 배열을해야한다 호출의 EXE 부분에서 :

$arguments = '"D:\spaced path\HelloWorld.txt"','--switch1','--switch2' 
$exe = 'notepad' 
&$exe $arguments 

Invoke-Expression을 사용하십시오. 모든 것이 문자열에 있어야하는 경우 문자열을 일반 표현식처럼 호출 할 수 있습니다. Invoke-Expression의 별칭은 iex입니다. 어느 경우

$exp = 'notepad "D:\spaced path\HelloWorld.txt"' 
Invoke-Expression $exp 

는, 인수 및 EXE 파일의 내용을 인용하고이 명령 줄에 바로 기록되는 것처럼 적절하게 포맷해야합니다.

+1

또한 올바르게 전달되도록 단일 문자열 내에서 인수를 따옴표로 묶어야합니다. – Joey

+0

감사합니다. 이 질문은 나에게 3 가지 유용한 대안을 주었지만, 마침내 "인수와 exe를 구분하십시오"경로로 진행되었습니다. –

+0

@Andrew : 대부분의 언어는 다른 프로세스를 시작하기위한 비슷한 분리 점을 가지고 있기 때문에 대부분이 방법을 사용합니다. –

4

당신이 당신의 문자열을 구축하는 로직을 유지하려면 :

$commandString = @('notepad', 'HelloWorld.txt') -join ' ' 

&([scriptblock]::create($commandstring)) 
관련 문제