将测试路径输出重定向到文本文件

redirecting test-path output to text file

txt 文件只是一堆 UNC 路径,我试图从这个文本文件中获取 UNC 路径列表,在验证测试路径后将其放入另一个文本文件中。它在屏幕上显示经过验证的路径,但文本文件未填充。

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { write-host "$_" | Out-File -FilePath c:\temp.txt -Append }
}

Write-Host 只写入控制台。我相信你想要的是 Write-Output.

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { write-output "$_" | Out-File -FilePath c:\temp.txt -Append }
}

此外,您可以省略 Write-Output,这也有效。

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { "$_" | Out-File -FilePath c:\temp.txt -Append }
}

背景信息补充:

  • Write-Host writes to the host[1] (typically, the console aka terminal), which bypasses PowerShell's success output stream 因此 不会通过管道发送任何内容.

    • 请参阅 的底部部分以了解何时 Write-Host 是合适的;简而言之:您通常应该只 将它用于 仅显示 输出 .
  • Write-Output is the appropriate cmdlet for producing data output, but it is rarely necessary, because you can rely on PowerShell's convenient implicit output behavior, as shown in Steven's answer and explained in .


另外,你的命令会执行得更好 如果你简单地 管道 % (ForEach-Object) 命令的输出 作为一个整体调用单个Out-File调用,而不是调用Out-File -Append每个输入路径.

您可以使用 Where-Object cmdlet 更优雅地执行您的命令,而不是使用带有条件显式输出的 %

Get-Content .\cfgpath.txt |
  Where-Object { Test-Path $_ } |
    Out-File -FilePath c:\temp.txt

另请注意,为了将 字符串 保存到文件,使用 Set-Content 比 [=86] 更有效=] Out-File,但请注意,在 Windows PowerShell 中,默认输出字符编码不同(在 PowerShell [Core] 6+ 中不再是一个问题,它始终默认为 BOM - 少 UTF-8);请参阅 this answer 了解何时选择哪个 cmdlet。

相比之下,Out-File>(其有效别名)使用 PowerShell 的格式化系统编写 for-display 表示任何非字符串输入对象到输出文件,默认情况下输出呈现到显示器的方式相同。
换句话说:要以适合以后程序化处理的方式将对象保存到文件中,您需要使用结构化文件格式,例如 CSV(Export-Csv) or JSON (ConvertTo-Json,结合 Set-Content)。


[1] 在 PowerShell 5.0 及更高版本中,Write-Host 现在写入新流,信息流(编号 6),默认情况下打印到主机.参见 about_Redirection。 因此,6> 重定向现在在技术上允许您通过管道发送 Write-Host 输出(尽管这样做不是一个好主意)或捕获/重定向它;例如,
Write-Host hi 6>&1 | % { "[$_]" }。注意这个重定向输出的对象类型是System.Management.Automation.InformationRecord.