如何在PowerShell中合并文件内容。 而且不要受苦

必须做什么


一旦我需要将位于一个目录中的一堆文本文件合并为一个文件。 我不想用手做,谷歌一如既往地帮助了我! 我听到了很多有关PowerShell等工具的强大功能的信息,因此决定将其用于此“大型任务”。 至少因为我不熟悉cmd.exe的糟糕透顶 。 好吧,用手做不是我们的方式。


出了什么问题


Google告诉我,这可以通过一个简单的命令来完成


Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt 

“真的很酷!只是某种Unix方式!” 我以为 我复制了命令,对其稍加修改,然后按Enter。 光标移到新行...仅此而已。 在文件管理器中,我打开了最终文件-确实与所需结果相似。 它在源文件中有很多行。 回到控制台,我看到该过程仍在进行中。 帮助Ctrl +C。


仔细查看文件大小,我发现它太大了。 它的大小超过100兆字节。 尽管水数据不是很大。


为什么会这样呢?


这都是关于我的“轻松修改”。 我只是不需要扩展过滤器。 是的,此参数是可选的。 结果发现,团队创建了结果文件,看到了它在目录中,将其读取,并将其内容写回到末尾,直到我按Ctrl + C为止,我都无法解释输出文件的持续增长。


我在“无菌”条件下重复了这一步骤。 为了简单和纯净,我在单独的目录中进行了实验,因为我怕杀死一台正在运行的机器


  1. 我创建一个文本文件


     echo "Hello world" > hello.txt 

  2. 我执行命令


     Get-ChildItem | Get-Content | Out-File result.txt 

    或简写形式


     dir | cat | Out-File result.txt 

    重复该问题。 生成的文件将增长,并用源中的一行(或源于自身的行?)进行补充。 在执行10秒后:


    • 源文件的一行变成40万行
    • 文件大小从11字节增加到将近8兆字节
    • 处理器的负载约为20-25%。
    • 磁盘子系统或RAM没有过载。 显然,PowerShell在使用这些组件方面进行了优化。 )


这也很有趣-如果您在目录中指定唯一文件的名称作为最后一个命令的参数,那么您当然会猜到鼓声 ...空将被写入文件!


这是一种如此“有趣”的工作逻辑


发生什么事了


第一步中创建的文件开始增长。 此行为至少是不可预测的。
操作系统继续正常运行也令人感到惊讶。 文件增长缓慢(或不是真的增长了),而没有阻塞用户的工作。


有什么危险


磁盘空间无法察觉的填充。


如何避免


过滤输入文件列表:


 Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt 

但是,如果输入文件和输出文件都符合过滤条件,则将无法保存


聚苯乙烯


我正在使用PowerShell版本5.1.17134.407。 顺便说一句,在试图找出答案时,我尝试了我所知道的所有方法/逻辑和常识(即-Version --version -v -h之类的标志)。 但这没有帮助。 一如既往地帮助了 Stackoverflow。 这是找出PowerShell版本的方法


 $PSVersionTable.PSVersion 

该答案已收集了将近3000个赞! 这当然不足以解决如何关闭vim的问题,但我认为这只是指示性的!


通常,PowerShell确实是功能强大的东西(至少与cmd.exe相比)! 当然,我将继续使用它。

Source: https://habr.com/ru/post/zh-CN433682/


All Articles