如何在Invoke-Command调用cmd.exe的输出每行添加远程主机名?
给Invoke-Command输出的每行添加远程主机名
有几种简单的方法可以实现这个需求,核心思路是在远程会话中处理第三方脚本的输出,给每行内容拼接上远程主机名后再返回:
方法1:处理标准输出
直接遍历第三方脚本的输出,每行前加上远程主机名(用$env:COMPUTERNAME获取):
Invoke-Command -ComputerName $Servers { cmd.exe /c ThirdPartyScript.bat | ForEach-Object { "[$($env:COMPUTERNAME)] $_" } }
方法2:捕获所有输出(含错误信息)
如果第三方脚本会输出错误内容到stderr,需要用2>&1把错误流重定向到标准输出,确保所有内容都能带上主机名:
Invoke-Command -ComputerName $Servers { cmd.exe /c ThirdPartyScript.bat 2>&1 | ForEach-Object { "[$($env:COMPUTERNAME)] $_" } }
方法3:使用$PSComputerName变量
Invoke-Command在远程会话中会自动设置$PSComputerName变量,它的值就是当前远程主机名,用法和$env:COMPUTERNAME一致:
Invoke-Command -ComputerName $Servers { cmd.exe /c ThirdPartyScript.bat 2>&1 | ForEach-Object { "[$($PSComputerName)] $_" } }
以上方法都会让返回的每一行输出前自动带上对应的远程主机名,方便你区分不同服务器的输出内容。
内容的提问来源于stack exchange,提问作者Tom Hunter
相关产品推荐
相关产品推荐

