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

Posted

技术标签:

【中文标题】将测试路径输出重定向到文本文件【英文标题】:redirecting test-path output to text file 【发布时间】:2022-01-03 20:49:02 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

背景信息补充Zam's helpful answer:

Write-Host 写入 主机[1](通常是控制台也称为终端),绕过 em> PowerShell 的 success output stream,因此 不会通过管道发送任何内容

查看this answer 的底部以了解何时适合Write-Host;简而言之:您通常应该将其用于仅显示输出

Write-Output 是生成数据输出的合适cmdlet,但很少需要,因为您可以依赖PowerShell 方便的隐式输出行为,如 Steven 的回答所示,并在 this answer 中解释。


此外,您的命令将执行得更好,如果您只是% (ForEach-Object) 命令的输出作为一个整体 传送到一个单个Out-File调用,而不是为每个输入路径调用Out-File -Append

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于将测试路径输出重定向到文本文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将控制台输出重定向到文本文件

linux下将编译错误输出到一个文本文件

linux下如何将,控制台输出的所有内容,全部输出到一个文本文件

重定向,常用转义字符

将 Visual C++ 控制台输出复制(不重定向)到文本文件,同时仍在控制台窗口中查看输出

将 Beeline 生成的表格重定向到没有网格的文本文件(Shell 脚本)