如何让PowerShell脚本中两个Cmdlet按序执行并正常显示结果?
问题:PowerShell脚本中命令执行顺序异常,pause前仅显示第一个命令结果
需求背景
需要批量获取多台电脑的MAC地址与IP地址,已找到对应PowerShell命令:
- 获取MAC地址:
Get-NetAdapter -Name "*Ethernet*","*Wi-Fi*"| Select Name,MacAddress
- 获取IP地址:
Get-NetIPAddress -InterfaceAlias "*Ethernet*","*Wi-Fi*" -AddressFamily IPv4 | Select InterfaceAlias, IPAddress
异常现象
将两个命令写入example.ps1脚本后:
Get-NetIPAddress -InterfaceAlias "*Ethernet*","*Wi-Fi*" -AddressFamily IPv4 | Select InterfaceAlias, IPAddress; Get-NetAdapter -Name "*Ethernet*","*Wi-Fi*"| Select Name,MacAddress; pause;
执行时出现异常:仅第一个命令的结果在pause执行后才显示,第二个命令的结果完全未输出,示例输出如下:
Press Enter to continue...: InterfaceAlias IPAddress -------------- --------- Ethernet 255.255.255.255 Wi-Fi 255.255.255.255
目前已验证:将命令放在bat文件中通过powershell -Command调用可正常运行,现需要PowerShell脚本内的解决方案。
解决方法
方法1:用Out-Host强制控制台输出
在每个命令后添加| Out-Host,强制将结果直接输出到控制台,绕过PowerShell的默认管道缓冲机制:
Get-NetIPAddress -InterfaceAlias "*Ethernet*","*Wi-Fi*" -AddressFamily IPv4 | Select InterfaceAlias, IPAddress | Out-Host; Get-NetAdapter -Name "*Ethernet*","*Wi-Fi*"| Select Name,MacAddress | Out-Host; pause;
方法2:先存储结果再统一输出(推荐)
先将两个命令的结果存储到变量中,再统一输出,最后执行pause,避免缓冲问题:
# 分别获取IP和MAC信息 $ipList = Get-NetIPAddress -InterfaceAlias "*Ethernet*","*Wi-Fi*" -AddressFamily IPv4 | Select InterfaceAlias, IPAddress $macList = Get-NetAdapter -Name "*Ethernet*","*Wi-Fi*"| Select Name,MacAddress # 依次输出结果 $ipList $macList pause;
方法3:用Write-Output显式输出结果
用Write-Output包裹每个命令的结果,确保结果被立即推送至输出流:
Write-Output (Get-NetIPAddress -InterfaceAlias "*Ethernet*","*Wi-Fi*" -AddressFamily IPv4 | Select InterfaceAlias, IPAddress); Write-Output (Get-NetAdapter -Name "*Ethernet*","*Wi-Fi*"| Select Name,MacAddress); pause;
内容的提问来源于stack exchange,提问作者Ebrahim Karam
相关产品推荐
相关产品推荐

