如何理解在PowerShell命令中省略%的情况


0

我们知道它实际上%是别名ForEach-Object。但我可以使用这样的命令"image"从文件名中删除

gci | Rename-Item -NewName {$_.Name.replace("image","")}

我知道这是ForEach-Object要实现它。如何理解省略字符的这种用法%


为什么这个命令不能省略该字符 %

ls | Rename-Item {$_.name ($_.name -replace "image")}//error command.

Answers:


2

Get-ChildItemcmdlet可获取所有当前文件夹中的文件,然后使用管道运算符(|)来发送这些文件重命名项目。

它逐个发送文件,每个文件作为一个单独的项目,以便Rename-Item逐个接收它们并依次对每个文件进行操作。

在脚本块中,$_自动变量表示通过管道进入命令时的每个文件对象,因此它可以对其进行操作。

此行为与操作系统的行为非常不同,其中管道中的第一个命令将所有输出生成为一个列表,然后通过管道将其作为一个块传递。

PowerShell管道哲学有以下目标:

  • 让每个程序做好一件事
  • 期望每个程序的输出成为另一个程序的输入

这样,您可以对程序进行字符串处理,其中每个程序都能很好地完成一件事,而不需要脚本使用诸如列表之类的人工对象。这样的复杂对象或列表需要解析,PowerShell通过传递项而不是列表来避免解析。

总而言之,ForEach-Object并不是必需的,因为PowerShell管道的概念是专门为避免需要它的循环而设计的。这里没有隐含的循环,只有两个程序,一个生成由管道中的下一个处理的项目。


你能告诉我为什么我不能省略{}吗?
yode

{}-NewName是封闭的操作数。这是个问题吗?
harrymc

哪里可以找到这样的用法?
yode

我只是认为存在{}使得%消失了..但我在文档中找不到这种用法
yode

1
对于括号,请看这个。对于%- 不,它不会消失,因为这里没有必要。
harrymc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.