2016-11-22 22 views
3

我编写了一个简单的脚本来修改远程计算机上的hosts文件,但出了问题。如何将param值传递给Invoke-Command cmdlet?

脚本:

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"显示$值值。 我做错了什么?

回答

2

你必须通过定义脚本块内的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 
+0

谢谢Martin。 – GVArt