PowerShell中的“%”(百分号)是什么作用?

148
似乎%运算符在管道后开始脚本块,虽然about_Script_Blocks表明%不是必需的。
这些都可以正常工作。
get-childitem | % { write-host $_.Name }

{ write-host 'hello' }

% { write-host 'hello' }

但是当我们在管道之后添加脚本块时,需要先使用百分号(%)。

get-childitem | { write-host $_.Name }

27
你可能也尝试过使用 Get-Help %。 - mjolinor
12
很有用。我不知道我可以在符号方面获得帮助。我看到我们也可以使用 get-help 查找 $_。太棒了! - Shaun Luttin
为什么要关闭投票?我想改进这个问题。 - Shaun Luttin
1
这也是一个模数运算符!只是在这种情况下不是。 - Cole9350
@Cole9350 这是一个有用的项目,可以添加到当前答案中。 - Shaun Luttin
显示剩余2条评论
3个回答

200

当在 cmdlet 上下文中使用 (如您的示例),它是 ForEach-Object 的别名:

> Get-Alias -Definition ForEach-Object

CommandType     Name                                                Definition
-----------     ----                                                ----------
Alias           %                                                   ForEach-Object
Alias           foreach                                             ForEach-Object

在方程的上下文中使用时,它是 模运算符:

> 11 % 5

1

作为求模运算符,% 也可以在 赋值运算符 (%=) 中使用:

> $this = 11
> $this %= 5
> $this

1

2
我会将其标记为答案,一旦它还包含%角色作为不同上下文中的模数运算符。 - Shaun Luttin
1
添加了方程和赋值运算符的示例。 - Kohlbrr
23
关于 Foreach-Object,我建议不要使用“%”符号 - 这会使得代码更难读取/维护 - 特别是对于刚开始接触 PowerShell 的人。让我们面对现实吧,拥有更多掌握 PowerShell 的人永远是一件好事。 - Simon Catlin
1
我在MSDN官方文档中哪里可以找到ForEach-Object的含义? - user1804599
我不同意Simon Catlin的观点,按照这个逻辑,我们都应该使用汇编语言,因为其他语言只是语法糖。 - reggaeguitar
百分号符号的另一个用途不能简单地被 ForEach-Object 替换: Get-ChildItem | % Name - robbie fan

24

一篇PowerShell - 特殊字符和标记的文章,介绍了多个符号,包括%

% (percentage)

1. Shortcut to foreach.
Task: Print all items in a collection.
Solution.
... | % { Write-Host $_ }

2. Remainder of division, same as Mod in VB.
Example:
5 % 2

7
价值是一个链接,其中描述了包括%在内的多个特殊字符。 - Michael Freidgeim
从技术上讲,它是 ForEach-Object 的别名。ForEach 也是 ForEach-Object 的别名 - 除非在语句开头使用它作为循环控制关键字(就像 while 一样)。 - mwfearnley

8

%可以替代Get-ChildItem |ForEach-Object{ write-host $_.Name }。如果没有%ForEach-Object,该命令将无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接