$server = "SOME_SERVER"
$target = "8.8.8.8"
Invoke-Command -ComputerName $server -ScriptBlock { Test-Connection -ComputerName $target }
所以我有这段代码,它给我抛出了一个错误
无法验证参数"计算机名"上的参数。参数是 空或空。提供一个不为 null 或为空的参数,然后 请重试该命令。
奇怪的是,如果我在最后一行将$target
更改为8.8.8.8
,一切都很好。
有人可以向我解释一下吗?我已经为此苦苦挣扎了一个小时,并在互联网上搜索寻找答案,但没有找到任何解决方案。这是PowerShell中的某种错误吗?
顺便说一句 - 如果我调用$target
,它给了我8.8.8.8
,类型是字符串,所以......
局部变量在远程连接中不可用。
您需要将其作为参数传递:
... -ArgumentList $target -ScriptBlock { param($target) ...
或利用$using
范围:
... Test-Connection -ComputerName $using:target ...
Invoke-Command
不会将局部变量传递给目标系统。$server
没有定义$target
,因此Test-Connection
命令将自$target -eq $null
以来失败,如错误所述。若要解决此问题,可以使用-ArgumentList
参数向远程服务器传递参数。例如:
Invoke-Command -ComputerName $server -ScriptBlock { Test-Connection -ComputerName $args[0] } -ArgumentList $target
我会使用结构化的方法:
$source = 'myserver'
$destination = '8.8.8.8'
Invoke-Command -ComputerName $source -Credential (Get-Credential) -ScriptBlock {
param(
[Parameter()]
[string]$destination
)
Test-Connection $destination
} -ArgumentList $destination
如果当前用户缺少所需的权限,则-Credential
参数很有用。