Comment passer un scriptblock comme l'un des paramètres de start-job
Je suis en train de créer une tâche en arrière-plan, qui exécute un scriptblock. J'ai besoin de passer cette scriptblock comme un paramètre, mais je n'arrive pas à obtenir la syntaxe de travail. Le scriptblock est converti en une chaîne de caractères quelque part le long du chemin.
Il fonctionne très bien lorsque je passe le bloc de script à une fonction locale, mais pas de la start-job
La syntaxe suivante fonctionne:
function LocalFunction
{
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
LocalFunction -ScriptBlock { echo "hello" }
Ce sorties "got bonjour" comme prévu.
Mais la suivante échoue:
$job = start-job -argumentlist { echo "hello" } -scriptblock {
param (
[parameter(Mandatory=$true)]
[ScriptBlock]$ScriptBlock
)
&$ScriptBlock | % { echo "got $_" }
}
start-sleep -s 1
receive-job $job
L'erreur, il renvoie est
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".
Donc, si je suis en train de lire l'erreur de droit, il semble que -argumentlist est de forcer en quelque sorte à ses arguments dans les chaînes.
Powershell gourous de savoir comment faire cette syntaxe travail?
Merci d'avance,
Ben
source d'informationauteur ben
Vous devez vous connecter pour publier un commentaire.
Voici une façon de résoudre cela, passer le scriptblock code comme une chaîne de caractères, puis créer un scriptblock de la chaîne à l'intérieur de l'emploi et de l'exécuter
Basé sur mes expériences, PowerShell est l'analyse -ArgumentList, qui est un Objet[], comme une chaîne de caractères, même lorsque vous passez dans un bloc de script. Le code suivant:
résultats dans la sortie suivante:
Système.Chaîne
Autant que je sache, la seule solution ici est Shay, si vous n'avez pas besoin de passer dans l'-ArgumentList comme une chaîne de caractères comme PowerShell va analyser votre bloc de script comme une chaîne de caractères dans ce cas.
Ressemble à ça aujourd'hui.
Vous devez le lire comme une chaîne de caractères puis de le convertir en un scriptblock.
Dans powershell v1 vous pouvez faire ceci:
Et en powershell v2 vous pouvez faire ceci:
De sorte que votre code devrait ressembler à ceci:
'[Scriptblock]::Create($ScriptBlock) " sera de placer les accolades autour de la chaîne pour vous de créer le bloc de script.
Trouvé l'info ici http://get-powershell.com/post/2008/12/15/ConvertTo-ScriptBlock.aspx
Donc, si votre désir est d'insérer une ligne scriptblock, puis Shay de la solution (comme indiqué) est probablement le meilleur. D'autre part, si vous voulez simplement passer un scriptblock en tant que paramètre d'envisager l'utilisation d'une variable de type
scriptblock
et en passant ensuite que la valeur de la-ScriptBlock
paramètre.