用于验证远程操作的局部变量

Local Variable to validate remote operation

我正在尝试验证远程计算机是否可以连接到特定端口上的另一台计算机

伪代码

$RemoteSession = New-PSSession -ComputerName MyRemoteVM

Invoke-Command -Session $RemoteSession -ScriptBlock {$RsTestResults = New-Object System.Net.Sockets.TcpClient -Argument 2ndRemoteVM , 2ndRemoteVMPort}

但是,我似乎无法获得该测试的结果 我试过像下面这样添加另一个 Invoke-Command,但它没有帮助

$LocalResults = Invoke-Command -ScriptBlock {$RsTestResults}

有什么想法吗?

当你这样做时:

Invoke-Command -Session $RemoteSession -ScriptBlock {
    $RsTestResults = New-Object System.Net.Sockets.TcpClient -ArgumentList 2ndRemoteVM, 2ndRemoteVMPort
}

正在远程主机上创建变量 $RsTestResults,其作用域为主机。如果要将 System.Net.Sockets.TcpClient 的结果存储在本地主机上,则需要像下面这样存储 Invoke-Command 的结果:

$RsTestResults = Invoke-Command -Session $RemoteSession -ScriptBlock {
    New-Object System.Net.Sockets.TcpClient -ArgumentList 2ndRemoteVM, 2ndRemoteVMPort
}

编辑

解释您收到的错误消息:

PS > New-Object System.Net.Sockets.TcpClient -ArgumentList $null, $null
New-Object : Exception calling ".ctor" with "2" argument(s): "The requested address is not valid in its context xxx.xxx.xxx.xxx:0"

这意味着 IPAddressPort 的变量永远不会传递给 Invoke-Command

您有 2 个选项可以将这些变量传递给 cmdlet,一个是 $using:variableName,另一个是 -ArgumentList.

假设你有2个局部变量,例如:

$ipAddress = $csv.IPAddress
$port = $csv.Port
$RsTestResults = Invoke-Command -Session $RemoteSession -ScriptBlock {
    New-Object System.Net.Sockets.TcpClient -ArgumentList $using:ipAddress, $using:port
}
$RsTestResults = Invoke-Command -Session $RemoteSession -ScriptBlock {
    param($ipAddress, $port)
    New-Object System.Net.Sockets.TcpClient -ArgumentList $ipAddress, $port
} -ArgumentList $ipAddress, $port