微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PowerShell ForEach-Object 和流水线 - 上游

如何解决PowerShell ForEach-Object 和流水线 - 上游

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?