Как передать значение параметра в командлет Invoke-Command?

Я написал простой скрипт powershell для изменения файла hosts на удаленных машинах, но что-то идет не так.

Автор сценария:

param(
   [string]$value
)

$username = 'username'
$password = 'password'
$hosts = "172.28.30.45","172.28.30.46"
$pass = ConvertTo-SecureString -AsPlainText $password -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username,$pass

ForEach ($x in $hosts){
   echo "Write in $x , value: $value"
   Invoke-Command -ComputerName $x -ScriptBlock {Add-Content -Path "C:\Windows\system32\drivers\etc\hosts" -Value $value} -Credential $cred
   echo "Finish writing."
}

echo "End of PS script."

При запуске он записывает новую пустую строку для каждого файла хостов. Эта линия echo "Write in $x , value: $value" отображает значение $ value. Что я делаю не так?

1 ответ

Решение

Вы должны передать параметр в блок скриптов, определив param раздел в вашем блоке сценария и передать параметры с помощью -ArgumentList:

Invoke-Command -ComputerName $x -ScriptBlock {
    param
    (
        [string]$value
    )
    Add-Content -Path "C:\Windows\system32\drivers\etc\hosts" -Value $value
    } -Credential $cred -ArgumentList $value

Или вы используете using: префикс переменной:

Invoke-Command -ComputerName $x -ScriptBlock {
    Add-Content -Path "C:\Windows\system32\drivers\etc\hosts" -Value $using:value
    } -Credential $cred
Другие вопросы по тегам