2012-03-29 4 views
3

Ich muss ein ps1-Skript auf einem Remote-Computer ausführen. Dem Skript wird ein einzelner Parameter übergeben, der einen Dateinamen darstellt. Ich habe viele, viele verschiedene Kombinationen und Ansätze versucht, um die Parameter an den Skriptblock zu übergeben, bekomme aber immer einen Fehler oder einen anderen , wenn ich versuche, Leerzeichen im Skriptnamen und/oder Dateinamen zu unterstützen.Wie gebe ich zitierte Parameter an PowerShell Invoke-Command und ScripBlocks weiter

Hinweis: Das Endergebnis wird ein Skript ausgeführt werden, eine auf REMOTE Computer den -ComputerName Parameter verwenden zu-Befehl aufrufen, aber der Einfachheit halber und testen alle Beispiele lokal ausgeführt.

die Probe "remote" Gegeben Skript

#processFile.ps1 
$args[0]  # just outputs the first parameter passed 

Die Werke nach, wenn es keine Leerzeichen im Namen sind

$cmd = ".\processFile.ps1" 
$fn = "someFile.csv" 
$sb = [ScriptBlock]::Create("$cmd $fn") 
Invoke-Command -ScriptBlock $sb 

# outputs the correct 
someFile.csv 

Allerdings ist die folgende nicht funktionieren

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("$cmd $fn") 
Invoke-Command -ScriptBlock $sb 

# outputs the incorrect 
some 

Offensichtlich muss der Dateiname-Parameter maskiert und als "einige Datei" übergeben werden. CSV ". Und dies kann mit dem folgenden

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("$cmd `"$fn`"") # notice the escape $fn parameter 
Invoke-Command -ScriptBlock $sb 

# outputs the correct 
some File.csv 

ABER getan werden, wenn ich versuche, diesen Raum zu unterstützen, um das Skript Namen erweitert, fällt alles auseinander. Die folgenden nicht

$cmd = ".\processFile.ps1" 
$fn = "some File.csv" 
$sb = [ScriptBlock]::Create("`"$cmd`" `"$fn`"") # notice the attempt to escape both parameters 

mit der folgenden Ausnahme

Exception calling "Create" with "1" argument(s): "Unexpected token 'some File.csv' in expression or statement." 

Alles, was ich versucht habe, und es gibt viele, viele verschiedene Ansätze, haben in etwas ähnliches geführt. Ich kann einfach nicht scheinen, dass beide Parameter entkamen. (Eigentlich ist das Problem mehr als ich nicht die ersten Parameter entweichen kann. Einige meiner Versuche verschachtelte Anführungszeichen enthalten, einfache Anführungszeichen, [Script] :: Create, {}, $ ExecutionContext usw.

Danke .

Antwort

4
diese

Versuchen:

$sb = [ScriptBlock]::Create(@" 
&'$cmd' '$fn' 
"@) 
+0

, das funktioniert. Danke mjolinor. Aber kannst du erklären, was hier vor sich geht? Ich verstehe, dass der "&" Operator die Zeichenfolge als einen Befehl behandelt, aber wie gilt das für die zwei Sätze von einfachen Anführungszeichen für die Parameter? – Jason

+1

Wenn Sie es so zitieren, müssen Sie es explizit aufrufen, andernfalls wird es nur als String behandelt.Das hat eigentlich nichts mit den einfachen Anführungszeichen für die Parameter zu tun - diese sollen die Parameter für die Kommandoargumente zusammenhalten. Durch die Verwendung der here-Zeichenfolge entfällt die Notwendigkeit, die Anführungszeichen zu schließen oder zu verdoppeln. Sie können beliebige Zitate eingeben, wo immer Sie wollen. – mjolinor

+0

Vielen Dank für die Erklärung. – Jason

4

Für alle über die akzeptierte Antwort von mjolinor rätselhaft, müssen Sie hinzufügen:

. $sb

Um den Skriptblock tatsächlich auszuführen.

Zusätzlich kann eine einfachere Syntax, die mir besser lesbar scheint, ist:

$cmd = @" 
&'$cmd' '$fn' 
"@ 
Invoke-Expression $cmd 
Verwandte Themen