为何PowerShell中Select-Object会先请求输入?执行顺序解析
为什么Select-Object会先触发Read-Host的输入请求?
场景1:使用Select-Object的执行效果
执行代码:
Get-NetAdapter | Select-Object Name Read-Host "Please input"
实际输出顺序(先弹出输入请求):
Please input: 1 Name ---- VMware Network Adapter VMnet1 1
场景2:使用Sort-Object的执行效果
执行代码:
Get-NetAdapter | Sort-Object Name Read-Host "Please input"
实际输出顺序:
Name ---- VMware Network Adapter VMnet1 Please input: 1 1
原因解析
这是PowerShell中管道cmdlet的执行逻辑差异导致的:
Sort-Object属于全收集型cmdlet:它必须等前序命令Get-NetAdapter输出所有对象,完成排序后才会一次性输出结果。因此网卡信息会先完整显示在控制台,之后才执行Read-Host弹出输入提示。Select-Object属于逐对象处理型cmdlet:它收到一个对象就处理输出一个,但PowerShell默认的表格格式化逻辑(自动调用的Format-Table)会延迟输出——因为需要等所有对象到齐后,才能确定列宽、生成整齐的表格。此时Read-Host会直接抢占控制台输入焦点,先弹出输入请求。等你完成输入回车后,Select-Object的所有对象都处理完毕,表格格式化才输出完整的表头和数据,最后再显示你输入的内容。
内容的提问来源于stack exchange,提问作者sycamore
相关产品推荐
相关产品推荐

