2009-08-15 3 views
5

In Windows Powershell, versuche ich einen Move-Befehl in einer Zeichenfolge speichern und dann ausführen. Kann mir jemand sagen, warum das nicht funktioniert?Warum kann ich ein Kommando mit Argumenten aus einer Zeichenfolge in Powershell ausführen?

PS C:\Temp\> dir 
    Directory: Microsoft.PowerShell.Core\FileSystem::C:\Temp 

Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   8/14/2009 8:05 PM  2596 sa.csproj 
-a---   8/15/2009 10:42 AM   0 test.ps1 


PS C:\Temp> $str = "mv sa.csproj sb.csproj" 
PS C:\Temp> &$str 
The term 'mv sa.csproj sb.csproj' is not recognized as a cmdlet, function, operable program, or script file. Verify the 
term and try again. 
At line:1 char:2 
+ &$ <<<< str 
PS C:\Temp> 

Ich bekomme diesen Fehler beim Speichern eines Befehls mit Argumenten. Wie überwinde ich diese Einschränkung?

Antwort

10

Von Hilfe (about_Operators):

$s = { mv sa.csproj sb.csproj } 
& $s 

Oder Sie verwenden Invoke-Expression:

Invoke-Expression $str 

oder

 
& Call operator 
    Description: Runs a command, script, or script block. Because the call 
    operator does not parse, it cannot interpret command parameters.

Sie einen Skriptblock anstelle einer Zeichenfolge verwenden können,

iex $str 

Im Gegensatz zu &, Invoke-Expressiondoes analysieren Sie den Inhalt der Zeichenfolge, so dass Sie alles hineinlegen können, nicht nur einen einzigen Befehl.

+0

Dank, denken Sie, Sie (oder einen Link zu) eine Erklärung, was das Zeichen & tut erklären kann? –

+2

'&' dient zum Ausführen eines einzelnen Befehls, Skripts oder Skriptblocks, genau wie die Hilfezustände. Es analysiert nicht, sondern akzeptiert nur ein einzelnes Argument, von dem angenommen wird, dass es sich um einen aufrufbaren Befehl handelt. Wenn Sie Parameter hinzufügen möchten, dann wickeln Sie den Aufruf entweder in ein Skript oder einen Skriptblock ein oder verwenden Sie "Invoke-Expression". Sie finden die Hilfeseite, auf der die Operatoren beschrieben werden, indem Sie in Powershell "help about_operators" eingeben. – Joey

5

Alle Johannes Vorschläge sind genau richtig, aber ich möchte die Leute darauf aufmerksam machen, dass es in V2 eine andere Option gibt. Sie setzen den Befehl in einer Zeichenkette wie zuvor, aber Sie setzen die Parameter in einer Hash-Tabelle und rufen & mit z.B .:

$cmd = 'mv' 
$params = @{Path = 'log.txt'; Destination = 'log.bak'} 
&$cmd @params 

Dieser verwendet eine neue V2 Funktion namens splatting. Es ähnelt der Verwendung einer Antwortdatei für einen Befehl, aber Sie fügen die Parameter in eine Hashtabelle statt in eine Datei ein.

Hinweis: Sie können auch die Parameter in einem Array setzen, die in den Parametern „von Positions“ nicht anhand des Namens zB Stecker wird:

$cmd = "cpi" 
$params = ('log.txt', 'log.bak') 
&$cmd @params 

Es kann nicht genau das Problem des OP passen, aber es ist ein Trick, über den es sich zu informieren lohnt.

2

Ich hatte eine ähnliche Frage vor einiger Zeit über den Aufruf eines externen Programms zu beantworten, nachdem eine Liste von Argumenten Aufbau:

Geprüft und es sieht aus wie . $program $argString oder & $program $argString verwenden, funktioniert aber nicht, wenn $argString mehrere Argumente enthält . Die Operatoren . und & führen nur einen direkten Aufruf durch und übergeben den gesamten $argString als einzelnes Argument.

Statt [string]$argString der Verwendung und tun $argString += "-aaa `"b b b`"", können Sie es zu [string[]]$argArray und $argArray += @('-aaa', 'b b b') verwenden ändern, was funktionieren wird und automatisch Strings als notwendig entkommen.

Sie können auch $process = [Diagnostics.Process]::Start($program, $argString) verwenden. Dies macht es einfacher, den Ausführungsfortschritt zu verfolgen, aber es ist schwieriger, eine Textausgabe zu erhalten.

Oder Sie können alles in eine Zeichenfolge setzen und Invoke-Expression "$program $argString" verwenden, die die gesamte Zeichenfolge als Befehl analysieren und korrekt ausführen wird.

Wie Keith erwähnt, splatting ist eine weitere gute Option in Powershell 2.

Verwandte Themen