将测试路径输出重定向到文本文件
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,因此 不会通过管道发送任何内容。
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下如何将,控制台输出的所有内容,全部输出到一个文本文件