powershell 附加到输出

powershell append to output

我是 'teaching myself to powershell' 并且已经开始裁剪了,google/this 网站还没有让我找到解决方案。我正在编译一个包含来自不同目录的文件列表的文本文件,但我无法将新数据附加到该文件。

get-childitem $dir -recurse | % {write-output $_.fullname} >$file

创建我的文件,但我想从下面追加新记录

get-childitem $dir2 -recurse | % {write-output $_.fullname} >$file

我已经尝试了添加内容和附加内容,但我无法弄清楚我没有做些什么来使它正确。

您可以使用Out-File写入文件,添加append参数将附加到文件。

Get-ChildItem $dir -recurse | Select-object -ExpandProperty Fullname | Out-File -FilePath $file
Get-ChildItem $dir2 -recurse | Select-object -ExpandProperty Fullname | Out-File -FilePath $file -Append

尝试:

get-childitem $dir -recurse | % {write-output $_.fullname} >> $file

(已测试并有效)

>> 使它始终追加,每次都覆盖一个 >

或者更改语法以使用 Out-File

get-childitem $dir -recurse | % {write-output $_.fullname} | out-file -filepath $file -Append

(未经测试)

在这种情况下,变量 $file 必须包含完整路径。喜欢:C:\directory\filename.txt

简答

这里使用的管道可以去掉,使用Out-File会让生活变得轻松:

Out-File (Get-ChildItem $dir -Recurse).FullName -FilePath $File

追加就是简单地使用 -Append 标志:

Out-File (Get-ChildItem $dir2 -Recurse).FullName -FilePath $File -Append

Note: This only works in PowerShell v3 and up, as PowerShell v2 relied on the pipeline to expand properties of objects within an array. In that case, the best route is to use something more like proposed on this same thread.

长答案和最佳实践

在另一个线程 Script to Append The File 中,他们在附加文件时遇到了类似的困难。但是,他们也以不必要的方式使用管道(比您在示例中使用的方式更多)。

他们的管道用法如下所示:

$PathArray | % {$_} | Out-File "C:\SearchString\Output.txt"

现在,Out-File 又有一个 -Append 参数。简单地修改他们的代码以在最后标记它就可以解决问题。

不过,他们的 ForEach-Object 语句(% 符号)在管道中毫无用处,也不需要(与您的使用方式非常相似)。这是因为您仅使用 ForEach-Object 循环输出对象而没有任何修改。这正是管道默认执行的操作,即将每个对象传递给下一个命令。

For more information on the pipeline: About Pipelines

If Update-Help has been run locally, one can use Get-Help to locally run Get-Help about_pipelines to see information too.

而不是这个:

$PathArray | % {$_} | Out-File "C:\SearchString\Output.txt" -Append

我们可以这样做:

$PathArray | Out-File "C:\SearchString\Output.txt" -Append

[推荐] 该示例还可以完全消除对管道的需求,因为如果没有管道则使用管道效率较低。在没有管道的情况下,或者在管道中每个管道的左侧,做所有可能做的事情,就是“向左过滤”(请参阅以下文章了解更多关于为什么应该向左过滤,向右格式化: Filtering Command Output in PowerShell):

Out-File -InputObject $PathArray -FilePath "C:\SearchString\Output.txt" -Append

Note: In the case above, -Append is only needed if the file already exists and is being extended.

记住:Get-Help,并阅读友好手册 (RTFM)

最简单的故障排除方法是查看帮助文档。使用 Get-Help 检查您需要的任何内容:参数集、可用参数、示例等。确保 运行 Update-Help 以便在本地提供详细文档。要检查所有内容:

Update-Help    
Get-Help Out-File -Full

有关数据 stream/output 重定向的更多详细信息:

  • PowerShell 重定向运算符,例如>>>(还有使用n>和[=34=的数据流重定向) ]),以及每个 PowerShell 版本的可用流:About Redirection in PowerShell(或:PowerShell 中的 Get-Help about_redirection
  • Tee-Object cmdlet),作为 Out-File(或:Get-Help tee-object 在 powerShell 中)
  • 的更强大版本的 cmdlet