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

Powershell 将测试路径输出重定向到文本文件,powershell,write-host,Powershell,Write Host,txt文件只是一组UNC路径,我试图在验证测试路径后,从这个文本文件中获取一个UNC路径列表,并将其放入另一个文本文件中。它会在屏幕上显示已验证的路径,但不会填充文本文件 $cfgs = Get-Content .\cfgpath.txt $cfgs | % { if (Test-Path $_) { write-host "$_" | Out-File -FilePath c:\temp\1.txt -Append } } 写入主机仅写入控制台。我相信你想要的是写输出 $cfgs = G

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

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

写入主机
仅写入控制台。我相信你想要的是
写输出

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { write-output "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}
此外,您可以省略
写入输出
,这也可以

$cfgs = Get-Content .\cfgpath.txt
$cfgs | % {
  if (Test-Path $_) { "$_" | Out-File -FilePath c:\temp\1.txt -Append }
}
要补充背景信息,请执行以下操作:

  • 写入主机[1](通常为控制台aka终端),该主机绕过PowerShell,因此不会通过管道发送任何内容

    • 写入主机
      合适时,请参见的底部部分;简而言之:您通常只应将其用于仅显示输出
  • 是生成数据输出的适当cmdlet,但是几乎没有必要,因为您可以依赖PowerShell方便的隐式输出行为,如Steven的回答所示,并在中解释


另外,如果您简单地将
%
()命令的输出作为一个整体传输到单个
输出文件
调用,而不是为每个输入路径调用
输出文件-追加
,那么您的命令将执行得更好

您可以使用cmdlet更优雅地实现命令,而不是将
%
与条件显式输出一起使用:

还请注意,要将字符串保存到文件中,使用而不是
更有效
输出文件
,但请注意,在Windows PowerShell中,默认输出字符编码不同(PowerShell[Core]6+不再关注此问题,它始终默认为无BOM的UTF-8);有关何时选择哪个cmdlet的信息,请参见

相比之下,
输出文件
(其有效别名)使用PowerShell的格式系统将任何非字符串输入对象的显示模式写入输出文件
,与默认情况下输出呈现到显示的方式相同。
换句话说:要以适合以后编程处理的方式将对象保存到文件中,您需要使用结构化文件格式,例如CSV()或JSON(,与
设置内容相结合)


[1] 在PowerShell 5.0及更高版本中,
Write Host
现在写入一个新的流,即信息流(编号
6
),默认情况下会打印到主机。看见 因此,从技术上讲,
6>
重定向现在确实允许您通过管道发送
写主机
输出(尽管这样做不是一个好主意)或捕获/重定向它;e、 g.,
Write Host hi 6>&1 |%{“[$\]”}
。请注意,此重定向输出的对象类型为

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