下面的Powershell版本信息:
Name Value
---- -----
PSVersion 5.0.10586.494
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.10586.494
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
我有以下powershell代码:
Write-Host "Step 1..."
$find = "string-to-find"
Get-ChildItem -Path D:\path\path\ -Include *.dat1, *.dat2, *.dat3, *.dat4, -Recurse `
| Select-String -SimpleMatch $find `
| Select-Object -Unique Path
Write-Host "Step 2 ..."
输出:
Step 1...
Step 2...
Path
----
D:\path\path\test.dat1
基本上,Get-ChildItem
的输出发生 AFTER 后续的Write-Host
声明 - 为什么????
鉴于此代码在以前的版本中运行良好 - 应该使用正确的输出方法,以便按照执行顺序显示输出?
提前致谢。
仍然尝试使用以下方法使其工作:
Get-ChildItem -Path D:\path\path\ -Include *.dat1, *.dat2, *.dat3, *.dat4, -Recurse `
| Select-String -SimpleMatch $find `
| Select-Object -Unique Path `
| ForEach-Object { $_ } | Write-Host
但输出如下:
@{Path=D:\path\path\something.dat1}
@{Path=D:\path\path\something.dat1}
我想要的只是列出的完整路径名(就像它在v5之前工作一样)。
答案 0 :(得分:1)
旧问题,但请添加我的答案,因为它是Google的最佳搜索结果之一。
如果您要继续使用Write-Host,例如由于其着色功能,可以通过显式地传递到Format-Table
来完成。完整的代码为:
Write-Host "Step 1..."
$find = "string-to-find"
Get-ChildItem -Path D:\path\path\ -Include *.dat1, *.dat2, *.dat3, *.dat4, -Recurse `
| Select-String -SimpleMatch $find `
| Select-Object -Unique Path `
| Format-Table
Write-Host "Step 2 ..."
Get-ChildItem(和类似的命令)或没有以变量\ file结尾的管道,最后通过对Write-Output
的隐式调用输出到控制台。
控制台输出显示为乱序,因为Write-Output不会同步写入控制台,除非您在Write-Output上显式调用Format-Table。
参考:
https://serverfault.com/questions/693549/powershell-write-host-not-synchronous
https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/14925213-bug-console-output-appears-out-of-order
答案 1 :(得分:0)
解决 - 改变所有"写主机"到"写输出"根据这篇文章:jsnover.com/blog/2013/12/07/write-host-considered-harmful