Wie gebe ich einen Skriptblock, der als einer der Parameter in der start-job
Ich versuche, erstellen Sie einen hintergrund-job, der führt einen Skriptblock. Ich brauche diesen scriptblock als ein parameter, aber ich kann nicht scheinen, um die syntax zu arbeiten. Der Skriptblock wird in einen string umgewandelt, irgendwo auf dem Weg.
Es funktioniert, wenn ich übergeben Sie das Skript blockieren, um eine lokale Funktion, aber nicht über start-job
Folgende syntax funktioniert:
function LocalFunction
{
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
LocalFunction -ScriptBlock { echo "hello" }
Diese Ausgänge "habe Hallo" als erwartet.
Aber der folgende Fehler auf:
$job = start-job -argumentlist { echo "hello" } -scriptblock {
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
start-sleep -s 1
receive-job $job
Den Fehler, die zurückgegeben werden,
Receive-Job : Cannot process argument transformation on parameter 'ScriptBlock'. Cannot convert the " echo "hello" " value of type "System.String" to type "System.Management.Automation.ScriptBlock".
Also, wenn ich bin das Lesen der Fehler Recht, es scheint, dass -argumentlist ist irgendwie zwingen, seine Argumente in strings.
Jede powershell-gurus wissen, wie man diese syntax funktioniert?
Vielen Dank im Voraus,
Ben
psake
. Ich erstellte eine Voraussetzung $prec = { ... }
und ich habe versucht, diesen selben Voraussetzung für die verschiedenen Aufgaben. Ich bekomme den gleichen Fehler, die Sie haben. Lassen Sie mich wissen, wenn Sie eine Lösung finden..InformationsquelleAutor ben | 2012-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Weg, um dieses Problem zu lösen, passieren Sie den Skriptblock-code als string, dann erstellen Sie einen Skriptblock aus der Zeichenfolge in der Arbeit, und führen Sie es
Nein, du hast Recht, es beantwortet nicht die Frage direkt, aber es gibt einen workaround. Soweit ich das beurteilen kann, die Parameter werden serialisiert (wie das bei remoting), und scriptblocks gehen nur über die in der strings. Die Problemumgehung ist die Verwendung der ScriptBlock.Create-Methode.
Danke. Krank verwenden Zeichenfolgen zu übergeben, um code. Ich entnehme dem, was Sie sagen : powershell-wird immer serialisieren Argumente, auch wenn Sie nicht mit Netzwerk, während nur auf der Durchreise, Sie von einer Methode zur anderen.
Nur um zu klären, PowerShell serialisiert Argumente für Job und Remoting cmdlets.
Große Abhilfe; das Skript blockiert Deserialisieren von strings ist durch (überraschende) design: "Historisch ist dies durch das design. Serialisieren scriptblocks mit der treue führte zu vielen Orten, wo es war die automatische Ausführung von code ermöglichen so sorgen Sie für eine sichere eingeschränkten runspaces, scriptblocks sind immer deserialisiert die Saiten." - github.com/PowerShell/PowerShell/issues/...
InformationsquelleAutor Shay Levy
Basierend auf meine Experimente, PowerShell-Analyse -ArgumentList, die ein Object [] als string, auch wenn Sie übergeben, die in einem script-block. Die folgenden code:
ergibt die folgende Ausgabe:
System.String
Soweit ich weiß, ist die einzige Lösung hier ist Shay, obwohl Sie sich nicht übergeben zu müssen, in der -ArgumentList als einen string, PowerShell analysieren Sie Ihre Skript-block als string in diesem Fall.
-ArgumentList
- Werte von analysiert Skript - Blöcke, ist es, dass Sie in strings umgewandelt auf der Deserialisierung (die, wie Shay, weist darauf hin, implizit einbezogen, wenn Sie Arbeitsplätze schaffen / tun remoting).InformationsquelleAutor James Kovacs
Sieht aus wie diese heute funktioniert.
&
Betreiber (oder, wenn Sie nicht wollen, erstellen Sie einen untergeordneten Bereich für Variablen, die.
Betreiber).InformationsquelleAutor awright18
Muss man gelesen haben, es als string und konvertieren Sie Sie dann in einen Skriptblock.
In powershell v1 können Sie dies tun:
Und in der powershell v2, können Sie dies tun:
Also würde der code so Aussehen:
'[Scriptblock]::Create($ScriptBlock), werden die geschweiften Klammern um den string für Sie die Erstellung der Skript-block.
Fand die info hier http://get-powershell.com/post/2008/12/15/ConvertTo-ScriptBlock.aspx
& $sb | ...
eher als$sb | ...
InformationsquelleAutor Erich Cottom
Also, wenn Ihr Wunsch ist das einfügen eines inline-scriptblock, dann Shay ' s Lösung (wie bereits erwähnt) ist wohl das beste. Auf der anderen Seite, wenn Sie wollen einfach nur pass einen Skriptblock, der als parameter betrachten, wobei eine variable vom Typ
scriptblock
und dann vorbei, als der Wert der-ScriptBlock
parameter.InformationsquelleAutor user432532