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

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

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

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

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


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

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

答案1

Get-ChildItemcmdlet 获取当前文件夹中的所有文件,然后使用管道运算符 ( |) 将这些文件发送到 Rename-Item。

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

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

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

PowerShell 管道哲学具有以下目标:

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

这样,您就可以将程序串起来,每个程序都能很好地完成一件事,而无需脚本使用诸如列表之类的人工对象。这种复杂的对象或列表需要解析,而 PowerShell 通过传递项目而不是列表来避免这种情况。

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

相关内容