Переменная Powershell передает начальную работу
в powershell Я хотел бы узнать лучший способ вызвать переменную в стартовом задании, поэтому мне не нужно редактировать script для каждого сервера, поскольку он будет определен на основе клиента, который я разместил my script on.
$Servername = 'Server1'
$pingblock = {
pathping $servername | Out-File C:\client\PS\ServerPing.TXT
}
start-job $pingblock
когда я запускаю свой код выше, я просто получаю файл с помощью, как будто я забыл указать $servername.
Ответы
Ответ 1
Используйте параметр -ArgumentList
на Start-Job
например:
Start-Job -Scriptblock {param($p) "`$p is $p"} -Arg 'Server1'
В вашем случае:
$pingblock = {param($servername) pathping $servername | Out-File C:\...\ServerPing.txt}
Start-Job $pingblock -Arg Server1
Ответ 2
Чтобы дополнить полезный ответ кита Хилла альтернативой PSv3+:
$using:
модификатор области может использоваться для ссылки на переменные в области вызывающей стороны внутри блока скрипта, переданного в Start-Job
, в качестве альтернативы для передачи аргументов (по умолчанию блок скрипта выполняется как фоновое задание не видит ни одной из переменных вызывающей стороны или других определений):
$Servername = 'Server1'
Start-Job { "Target: " + $using:ServerName } | Receive-Job -Wait -AutoRemoveJob
Выше приведено:
Target: Server1
Обратите внимание, что эту же технику можно использовать при передаче блока сценария для выполнения на удаленном компьютере в Invoke-Command
- см. этот вопрос.