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 .
, 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
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
Vielen Dank für die Erklärung. – Jason