我正在尝试验证远程机器是否可以通过特定端口连接到另一台机器
伪代码$RemoteSession = New-PSSession -ComputerName MyRemoteVM
Invoke-Command -Session $RemoteSession -ScriptBlock {$RsTestResults = New-Object System.Net.Sockets.TcpClient -Argument 2ndRemoteVM , 2ndRemoteVMPort}
然而,我似乎无法得到那次测试的结果我试过像下面这样添加另一个调用命令,但它没有帮助
$LocalResults = Invoke-Command -ScriptBlock {$RsTestResults}
任何想法吗?
当你这样做的时候:
Invoke-Command -Session $RemoteSession -ScriptBlock {
$RsTestResults = New-Object System.Net.Sockets.TcpClient -ArgumentList 2ndRemoteVM, 2ndRemoteVMPort
}
在远程主机上创建变量$RsTestResults
,其作用域为host。如果希望将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"
这意味着,IPAddress
和Port
的变量永远不会传递给Invoke-Command
。
你有2个选项来传递这些变量给cmdlet,一个是与$using:variableName
,另一个是与-ArgumentList
。
假设你有2个局部变量,例如:
$ipAddress = $csv.IPAddress
$port = $csv.Port
- With
$using:variableName
$RsTestResults = Invoke-Command -Session $RemoteSession -ScriptBlock {
New-Object System.Net.Sockets.TcpClient -ArgumentList $using:ipAddress, $using:port
}
- With
-ArgumentList
$RsTestResults = Invoke-Command -Session $RemoteSession -ScriptBlock {
param($ipAddress, $port)
New-Object System.Net.Sockets.TcpClient -ArgumentList $ipAddress, $port
} -ArgumentList $ipAddress, $port