0

我有一个小的 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 中。

4

1 回答 1

0

因此通常要先完成 dir ,在它周围加上括号,否则管道将一次来回移动一个对象,并可能包含新文件。重命名脚本会发生这种情况。我认为在 powershell 7 中这不太常见。

(dir) | ForEach-Object { 7z a -tzip -mmt=32 $_.BaseName $_.Name }
于 2021-07-26T15:45:11.873 回答