为什么Invoke-Command
在远程运行命令时与在完全相同的系统上本地运行完全相同的命令时给出不同的结果?
这些远程调用的命令显示 4 个空行:
PS > Invoke-Command cluster02 { cmd /c dir c:\ | select-string 'bytes free' }
虽然这些本地命令按预期输出:
PS > Invoke-Command cluster02 { (cmd /c dir c:\ | select-string 'bytes free').line }
11 Dir(s) 828,179,570,688 bytes free
如果我先启动Enter-PSSession cluster02
然后运行它们,这两个命令都会返回预期的输出。
这是旧 PowerShell(Windows 2012)上的错误还是我错过了一些 PS 特性?如果它是一个错误或特殊性,它何时出现?换句话说,从这种奇怪的行为中可以学到什么吗?
您遇到的问题是您尝试
cmd /c
使用 cmddir
命令远程运行,然后将其远程传输到 PowerShell 命令。虽然您期望它在远程运行时完全按照它在本地运行的方式工作,但众所周知,这会产生差异并引起混乱。
如远程运行时需要用户配置文件的命令中所述
当我在
Invoke-Command -ScriptBlock {}
远程机器上运行时,我尽量将命令保持为 PowerShell。如果您混合使用 cmd 和 PowerShell,则应该进行广泛的测试,因为它的工作方式可能与您在交互式登录系统时运行它时的工作方式不同。远程 PowerShell,以字节为单位获取驱动器可用空间(否
cmd
)输出
解决方法
将 的输出设置
Invoke-Command
为变量,然后从中选择字符串和 line 属性似乎可以达到您喜欢的所需输出的目的。PowerShell(变体 1)
输出
该问题可能是由于
cmd /c
在远程调用会话中调用然后 PowerShell 管道从中选择匹配字符串。invoke-command
我通过将正确返回的完整输出保存为外部变量来解决该问题invoke-command
,然后在外部相应地解析该变量invoke-command
。PowerShell(变体 2)
这是与上面相同的处理,但不是将变量放入混合中,只需将
Invoke-Command
右侧的管道传递给Select-String
查询。或者甚至是这样的......