web-dev-qa-db-fra.com

Powershell passe la variable au début du travail

dans powershell, j'aimerais apprendre la meilleure façon d'appeler une variable pour un travail de démarrage, donc je n'ai pas à modifier le script pour chaque serveur car il sera spécifique en fonction du client sur lequel j'ai placé mon script.

$Servername = 'Server1'
    $pingblock = {
      pathping $servername | Out-File C:\client\PS\ServerPing.TXT
    }
    start-job $pingblock

lorsque j'exécute mon code ci-dessus, je reçois simplement un fichier avec l'aide comme si j'avais oublié de spécifier le $ servername.

21
jjamesjohnson

Utilisez le -ArgumentList paramètre sur Start-Job par exemple.:

Start-Job -Scriptblock {param($p) "`$p is $p"} -Arg 'Server1'

Dans ton cas:

$pingblock = {param($servername) pathping $servername | Out-File C:\...\ServerPing.txt}
Start-Job $pingblock -Arg Server1
30
Keith Hill

Pour compléter la réponse utile de Keith Hill avec une alternative PSv3 +:

Le $using: modificateur de portée peut être utilisé pour référencer les valeurs des variables dans la portée de l'appelant à l'intérieur du bloc de script passé à Start-Job, comme alternative au passage d'arguments (par défaut, un bloc de script exécuté en tâche de fond ne ne voit aucune des variables de l'appelant ou d'autres définitions ):

$Servername = 'Server1'
Start-Job { "Target: " + $using:ServerName } | Receive-Job -Wait -AutoRemoveJob

Les résultats ci-dessus:

Target: Server1

Notez que la même technique peut être utilisée lors du passage d'un bloc de script pour exécution sur un ordinateur distant à Invoke-Command - voir cette question .

6
mklement0