如何解决PowerShell $_ 语法
在 this answer 中,作者提出了以下片段:
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
我可以理解其中的大部分内容,但我无法搜索最后一部分的文档。搜索的输出通过管道 |
并在 %{}
和 $_
中使用。
我已经围绕它进行了实验,%{}
是我相信的 for-each 语句,bing search was not effective。 $_
也有点神奇:它是一个变量,没有名字,因此立即被消耗?我不太关心 .FullName
,我整理的那部分。同样,bing search was not effective,也不在 PowerShell 文档中搜索这些字符序列。
谁能给我解释一下?
解决方法
static void registerClasses() {
register<Home>("Home",() => Home());
}
不是“一件事” - 它是两件事:%{}
和 %
{}
是 ForEach-Object
cmdlet 的别名:
%
...所以它解析为:
PS ~> Get-Alias '%'
CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
... |ForEach-Object { $_.FullName }
基本上是 PowerShell 的 map
function - 它通过管道获取输入并将 ForEach-Object
块中描述的操作应用于每个输入。
{}
是对当前正在处理的管道输入项的自动引用
你可以把它想象成一个 $_
循环:
foreach($thing in $collection){}
除了我们现在可以将循环放在管道中间并让它产生立即消耗的输出:
1..10 |ForEach-Object { $_ * 10 }
# produces the same output as
foreach($n in 1..10){
$n * 10
}
1..10 |ForEach-Object { $_ * 10 } |Do-SomethingElse
不是唯一在 PowerShell 中使用 ForEach-Object
自动变量的东西——它还用于管道绑定表达式:
$_
... 以及属性表达式,一种动态属性定义类型,由许多 cmdlet 支持,例如 mkdir NewDirectory |cd -Path { $_.FullName }
:
Sort-Object
... 1..10 |Sort-Object { -$_ } # sort in descending order without specifying -Descending
:
Group-Object
... 和 1..10 |Group-Object { $_ % 3 } # group terms by modulo congruence
:
Select-Object
,
为了补充 Mathias' answer,它很好地解释了特定结构,以及您如何能够/不可能自己发现这些信息,使用 PowerShell 自己的帮助系统:
相关帮助主题和帮助系统的使用:
注意:要获得 PowerShell 帮助系统各个方面的概述,只需运行 help
。
-
%
是ForEach-Object
cmdlet 的内置 alias:- 使用
Get-Help ForEach-Object
在终端中查看帮助主题。- 如果未找到本地主题,您必须通过
Update-Help
cmdlet 下载它们。
- 如果未找到本地主题,您必须通过
- 提示:
-
添加
-Online
开关以在浏览器中打开主题的(可能是最新的)online version。 -
您可以通过
Get-Help Get-Help
(甚至help help
)引导您对Get-Help
的使用:- Cmdlet 特定的帮助位于详细级别:简洁(默认,仅显示语法和概述说明)、
-Detailed
(包括参数说明和示例命令)和 {{1} }(另外包括技术参数信息和扩展注释)。 -
-Full
只能用于显示示例命令。 - 使用基于关键字的搜索(见下文),您可以使用
-Examples
参数将结果限制为特定类别的主题。
- Cmdlet 特定的帮助位于详细级别:简洁(默认,仅显示语法和概述说明)、
-
为方便起见,您还可以使用内置的
-Category
function,它用显示分页包装help
调用(简单地说:通过管道输出到Get-Help
实用程序)并默认为详细级别more
。
-
- 使用
-
-Full
是一个 script block literal,一个可以按需调用的任意 PowerShell 代码块:-
{...}
在本地显示主题;help about_Script_Blocks
前缀表示该主题是一个概念性帮助主题(而不是涵盖特定命令的主题);当您使用about_
搜索关键字(见下文)时,您可以(有点模糊地)使用Get-Help
将结果限制为概念性主题。 - 注意:在撰写本文时,
-Category HelpFile
主题还可以不能通过添加about_
直接在线查看 - 请参阅 GitHub issue #13550 - 但很容易用谷歌搜索他们的名字。
-
-
-Online
是一个 variable,正如$_
后跟一个标识符所暗示的那样,更具体地说是一个 automatic (built-in) variable:-
$
涵盖一般变量。 -
help about_Variables
涵盖自动的。
-
仅根据符号和别名如何可以/不能发现上述内容:
在网络上搜索符号是出了名的无用。
- 顺便说一句:同时运行不同的语法结构,例如
help about_Automatic_Variables
和%
,它们之间没有空格(例如{ ... }
)会构成额外的障碍,因此应该避免。立>
仅使用 PowerShell 的帮助系统来缩小搜索范围会有所帮助,但仅限于程度:
-
%{$_.FullName}
- 因为
%
知道别名,Get-Help
实际上工作正常并直接显示help %
的帮助主题。 -
ForEach-Object
显示了包括使用脚本块和自动help % -Examples
变量的示例命令。
- 因为
-
即使
$_
支持基于关键字的搜索,搜索基于符号的术语{ {1}} 和Get-Help
直接没有帮助,因为即使将搜索限制为概念性({}
-prefixed主题)与$_
,要么点击次数过多(about_
),要么相关主题根本不显示(-Category HelpFile
) -
help '$_' -Category HelpFile
可以间接地被发现,如果你已经知道它是一个变量的实例:-
help '{}' -Category HelpFile
恰好将您直接带到相关(本地)about_Automatic_Variables 主题, - 而
$_
列出以下匹配的主题help variables -Category HelpFile
,``,help variable -Category HelpFile
,about_Variable_Provider
,about_Automatic_Variables
,{{ 1}} 和about_Preference_Variables
- 注意:由于 PowerShell 对 wildcard expressions 的普遍支持,您也可以按如下方式执行搜索:
about_Remote_Variables
- 请务必将 两者都括起来 em>about_Variables
中搜索词的两侧。
-
-
about_Environment_Variables
可以间接地被发现,如果你已经知道它是一个脚本(代码)的实例块:-
help about*variable*
将您直接带到相关(本地)about_Script_Blocks
主题。
-
未来的潜在改进:
-
如果 PowerShell 的帮助系统支持基于符号的重点搜索,那将是一个巨大的改进。
-
同样,直接查找运算符(例如
*
、regular-expression matching operator)的能力也会很有帮助:-
GitHub issue #11339 就是这么建议的。
-
在相关说明中,GitHub issue #11338 建议添加查找 .NET 类型(在线)文档的功能。
-
This answer 包含自定义函数
$_
和help about_*block*
,它们暂时填补了这一空白(也可用作 Gists)。
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。