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.
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
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 .