PowerShell ForEach-Object 和流水线 - 上游
PowerShell ForEach-Object and Pipelining - upstream
我有一个小的 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。
通常让 dir 先完成,在它周围加上括号,否则管道将一次来回一个对象,并可能包含新文件。重命名脚本会发生这种情况。我认为在 powershell 7 中这种情况不太常见。
(dir) | ForEach-Object { 7z a -tzip -mmt=32 $_.BaseName $_.Name }
我有一个小的 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。
通常让 dir 先完成,在它周围加上括号,否则管道将一次来回一个对象,并可能包含新文件。重命名脚本会发生这种情况。我认为在 powershell 7 中这种情况不太常见。
(dir) | ForEach-Object { 7z a -tzip -mmt=32 $_.BaseName $_.Name }