我有一个小的 powershell 脚本,可以将所有文件和文件夹分别压缩到一个文件夹中:
dir | ForEach-Object { 7z a -tzip -mmt=32 $_.BaseName $_.Name };
假设我的目录中有两个文件夹:
test1
test2
没有别的了。目前,此代码将创建“test1.zip”和“test2.zip”,其中包含各自的文件夹,但也再次包含它们自己(即 test1.zip)。对于两个文件夹,7z 被调用四次:每个文件夹一次创建一个 zip,然后每个新的 zip 文件一次通过包含 zip 本身来更新 zip。显然这不是我们想要的结果:
Content of test1.zip:
test1
test1.zip
管道似乎获取了新文件的更新并将它们转发到 ForEach-Object 命令,这意味着“test1.zip”被迅速添加到“test1.zip”中。
我对为什么会发生这种情况感到困惑(甚至更令人不安:并非所有运行都是这种情况),因为我认为该语句是从左到右完成的,意思是dir
它的输出已完成并固定,然后是(可能并行)由 处理ForEach-Object
。
我哪里错了?
dir | ForEach-Object { Write-Host ("I see:"+$_.Name);7z a -tzip $_.Name $_.Name };
表明即使是新创建的 zip 文件也被流水线化到 ForEach-Object 中。