2011-07-06 7 views
22

Używając opcji powershell, możesz użyć znaku "&" do uruchomienia innej aplikacji i przekazania parametrów.Dynamicznie generuj polecenie wiersza polecenia, a następnie wywołaj przy użyciu powłoki powers

Prosty przykład.

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

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

To dobrze. Ale co jeśli chcę użyć logiki biznesowej do dynamicznego generowania ciągu poleceń? Stosując ten sam prosty przykład:

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

pojawia się błąd:

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.

W moim prawdziwym przykład próbuję dynamicznie dodać lub usunąć opcje końcowej linii poleceń łańcucha. Czy istnieje sposób, w jaki mogę to zmienić?

+0

Czy cytowanie w cudzysłowach („”) pomóc? – cristobalito

Odpowiedz

25

dwa sposoby aby to zrobić:

Osobne exe z argumentów. Czy cały swój dynamiczny materiał na argumenty, ale wywołać exe jako normalne ze zmienną gospodarstwa argumenty potem:

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

#or 
notepad $argument 

Jeśli masz więcej niż jeden argument, należy dokonać jej tablicę jeśli będzie to oddzielny z eXE części połączenia:

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

użytku Invoke ekspresji. Jeśli wszystko musi być w ciągu znaków, możesz wywołać ciąg znaków, tak jakby był normalnym wyrażeniem. Invoke-Expression ma również alias z iex.

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

W obu przypadkach zawartość argumentów i tego exe powinien być odpowiednio sformatowana i cytowany tak, jakby były napisane prosto w linii poleceń.

+1

Należy również pamiętać, że należy podać argumenty w obrębie pojedynczego ciągu, aby upewnić się, że zostały poprawnie przekazane. – Joey

+0

Dzięki. To pytanie dało mi trzy użyteczne alternatywy, ale w końcu poszedłem ze ścieżką "Oddzielny exe od argumentów". –

+0

@Andrew: Używam tego podejścia przez większość czasu, ponieważ większość języków ma podobną separację do uruchamiania innych procesów. –

4

Jeśli chcesz zachować tę logikę do budowania swoich strun:

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

&([scriptblock]::create($commandstring)) 
Powiązane problemy