如何防止Powershell中的这种无限循环?

how to prevent this infinite loop in powershell?

在 PowerShell 中执行以下命令后,在命令行上参考 this 教程时,它会进入无限循环。

echo "I am a new file." > ex15.txt
cat ex15.txt > another.txt
cat *.txt > bigfile.txt

发出最后一个命令后,执行绝不会 ends.It 进入无限循环。但这在使用 type 命令的命令提示符下工作正常。

type *.txt > bigfile.txt

此命令不会进入无限循环。这非常有效。为什么这在 PowerShell 中不起作用?

Powershell 中的

Cat (Get-Content) 与 cmd 中的 type 命令不同。

Type 不会看到正在写入的 bigfile.txt,但是 Get-Content 会看到并且您最终会读取 bigfile.txt 并写入同一个文件,因此它卡在一个循环。

为了防止循环,您可以强制 cat 在写入之前完成所有文件的读取,方法是将 cat 表达式包装在括号中:

(cat *.txt) > bigfile.txt

正如@mjolinor 所解释的那样,Get-Content 读取您添加到 bigfile.txt 的数据的速度与写入数据的速度一样快,导致命令永远不会结束。

最简单的解决方案是将 bigfile.txt 放入不同的目录,这样它就不是您正在阅读的文件之一。例如:父目录。

cat *.txt > ..\bigfile.txt

另一种变体是从您要读取的当前路径中的文件中排除 'bigfile.txt':

cat (ls *.txt -Exclude bigfile.txt) > bigfile.txt