Переменная 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 - см. этот вопрос.