我们知道实际上%
是的别名。但我可以使用这样的命令从文件名中ForEach-Object
删除"image"
gci | Rename-Item -NewName {$_.Name.replace("image","")}
我知道是调用ForEach-Object
来实现的。如何理解省略字符的这种用法%
?
为什么这个命令不能省略字符%
ls | Rename-Item {$_.name ($_.name -replace "image")}//error command.
答案1
该Get-ChildItem
cmdlet 获取当前文件夹中的所有文件,然后使用管道运算符 ( |
) 将这些文件发送到 Rename-Item。
它将每个文件作为单独的项目逐个发送,以便Rename-Item
逐个接收它们并依次对每个文件进行操作。
在脚本块中,$_
自动变量代表每个文件对象,因为它通过管道到达命令,因此可以对其进行操作。
这种行为与操作系统的行为非常不同,在操作系统中,管道中的第一个命令产生所有输出作为一个列表,然后将其传递为一个块通过管道。
PowerShell 管道哲学具有以下目标:
- 让每个程序做好一件事
- 期望每个程序的输出成为另一个程序的输入
这样,您就可以将程序串起来,每个程序都能很好地完成一件事,而无需脚本使用诸如列表之类的人工对象。这种复杂的对象或列表需要解析,而 PowerShell 通过传递项目而不是列表来避免这种情况。
总而言之,ForEach-Object
这不是必需的,因为 PowerShell 管道的概念是专门为避免需要它的循环而设计的。这里没有隐含的循环,只有两个程序,一个程序生成由管道中的下一个程序处理的项目。