2

这个答案中,作者提出了以下片段:

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

我可以理解其中的大部分内容,但我无法搜索最后一部分的文档。搜索的输出通过管道传输|并在%{}和 as 中使用$_

我已经围绕它进行了实验,%{}我相信这是一个 for-each 语句,必应搜索无效$_也有点神奇:它是一个变量,没有名称,因此立即被消耗?我不太关心.FullName我整理的那部分。同样,bing 搜索无效,也没有在 PowerShell 文档中搜索那些字符序列。

谁能给我解释一下?

4

2 回答 2

6

%{}不是“一件事”——它是两件事:%{}

%ForEach-Objectcmdlet的别名:

PS ~> Get-Alias '%'
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object

...所以它解析为:

... |ForEach-Object { $_.FullName }

ForEach-Object基本上是 PowerShell 的map功能- 它通过管道获取输入并将{}块中描述的操作应用于它们中的每一个。

$_是对正在处理的当前管道输入项的自动引用

你可以把它想象成一个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

ForEach-Object不是唯一$_在 PowerShell 中使用自动变量的东西 - 它也用于管道绑定表达式:

mkdir NewDirectory |cd -Path { $_.FullName }

...以及属性表达式,一种由许多 cmdlet 支持的动态属性定义,例如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

1..10 |Select-Object @{Name='TimesTen';Expression={$_ * 10}} # Create synthetic properties based on dynamic value calculation over input 
于 2021-03-10T14:42:43.937 回答
2

为了补充Mathias 的回答,它很好地解释了具体的结构,以及您如何/不可能自己发现这些信息,使用PowerShell 自己的帮助系统

相关帮助主题和帮助系统的使用

注意:要全面了解PowerShell 帮助系统的各个方面,只需运行help.

  • %是cmdlet的内置别名:ForEach-Object

    • 用于Get-Help ForEach-Object查看终端中的帮助主题。
      • 如果未找到本地主题,则必须通过Update-Helpcmdlet 下载它们。
    • 提示:
      • 添加-Online开关以在浏览器中打开该主题的(可能是最新的)在线版本。

      • 您可以引导您使用Get-Helpwith Get-Help Get-Help(甚至help help):

        • 特定于 Cmdlet 的帮助具有详细级别:简洁(默认,仅显示语法和概述描述)、-Detailed(包括参数描述和示例命令)和-Full(还包括技术参数信息和扩展说明)。
        • -Examples只能用于显示示例命令。
        • 使用基于关键字的搜索(见下文),您可以使用参数将结果限制为特定类别的主题-Category
      • 为方便起见,您还可以使用内置help 函数Get-Help,它使用显示分页包装调用(简单地说:通过管道将输出传递给more实用程序)并默认为 detail level -Full

  • {...}是一个脚本块文字,一个可以按需调用的任意 PowerShell 代码块:

    • help about_Script_Blocks在本地显示主题;about_前缀表示该主题是概念性帮助主题(而不是涵盖特定命令的主题);当您用于Get-Help搜索关键字(见下文)时,您可以(有点模糊)将结果限制为概念性主题-Category HelpFile
    • 注意:在撰写本文时,还不能通过添加直接在线查看about_主题- 请参阅GitHub 问题 #13550 - 但通过名称搜索它们很容易。-Online
  • $_是一个变量,正如$后面跟着标识符的标志所暗示的那样,更具体地说是一个自动(内置)变量

    • help about_Variables一般涵盖变量。
    • help about_Automatic_Variables涵盖自动的。

仅基于符号和别名如何/不能发现上述内容:

众所周知,在网络上搜索符号是没有帮助的。

  • 顺便说一句:运行不同的语法结构,例如%and{ ... }在一起,它们之间没有空格(例如%{$_.FullName})构成了一个额外的障碍,因此应该避免。

仅使用 PowerShell 的帮助系统来缩小搜索范围会有所帮助,但程度有限

  • %

    • 因为Get-Help知道别名,help %实际上工作正常并直接显示ForEach-Object的帮助主题。
    • help % -Examples显示了包括使用脚本块和自动$_变量的示例命令。
  • 即使Get-Help支持基于关键字的搜索直接搜索基于符号的术语{}无济于事$_,因为即使将搜索限制为概念性以 -about_前缀的主题)-Category HelpFile,也有太多的命中 ( help '$_' -Category HelpFile) 或相关主题没有完全不显示 ( help '{}' -Category HelpFile)

  • $_可以间接发现,如果您已经知道它是一个变量的实例:

    • help variables -Category HelpFile恰好将您直接带到相关的(本地)about_Automatic_Variables主题,
    • help variable -Category HelpFile 列出以下匹配主题about_Variable_Provider,``, about_Automatic_Variables, about_Preference_Variables, about_Remote_Variables, about_Variables, 和about_Environment_Variables
    • 注意:由于 PowerShell 对通配符表达式的普遍支持,您也可以按如下方式执行搜索:help about*variable*- 请务必将搜索词的两边都*在.
  • $_可以间接发现,如果您已经知道它是脚本(代码)的实例:


潜在的未来改进:

  • 如果 PowerShell 的帮助系统支持基于符号的集中搜索,那将是一个很大的改进。

  • 类似地,直接查找操作符的能力,例如正-match表达式匹配操作符,会很有帮助:

    • GitHub 问题 #11339就是这样提出的。

    • 在相关说明中,GitHub 问题 #11338建议添加查找.NET 类型文档的功能(在线)。

    • 此答案包含自定义函数Show-OperatorHelpShow-TypeHelp,目前填补了这一空白(也可作为 Gists 获得)。

于 2021-03-10T17:28:18.420 回答