为什么“ Get-ChildItem -File | Get-FileHash”有效?

时间:2020-02-11 20:18:19

标签: powershell

我对Bash的了解要比对Powershell更为熟悉,有时我会对后者的对象模型感到困惑。

documentation of Get-FileHash看,似乎有3种指定输入的方式:

  • Get-FileHash [-Path]
  • Get-FileHash [-LiteralPath]
  • Get-FileHash [-InputStream]

前两个使用文件名,第三个使用数据流。

现在,根据Get-ChildItem -File所说的话,System.IO.FileInfo似乎可以输出Get-Member个对象:

$ Get-ChildItem -File | Get-Member
TypeName: System.IO.FileInfo

但是管道Get-ChildItem -File | Get-FileHash仍然可以正常工作。我的问题是,什么机制可以将System.IO.FileInfo转换为Get-FileHash期望的输入类型?

3 个答案:

答案 0 :(得分:8)

PowerShell cmdlet输出的

Array.map() / fetch('https://my-json-server.typicode.com/typicode/demo/posts') .then(res => res.json()) .then(async data => { const details = await Promise.all(data.map(post => { return fetch(`https://my-json-server.typicode.com/typicode/demo/posts/${post.id}`) .then(res => res.json()); })); console.log(details); }) 实例具有 System.IO.FileInfo属性 [*] ,其中包含实例的全部内容限定路径,即PS提供者名称(例如System.IO.DirectoryInfo)前缀的完整文件系统路径。

诸如.PSPath之类的文件处理cmdlet具有 Microsoft.PowerShell.Core\FileSystem::C:\windows 参数 ,其别名为Get-FileHash

由于-LiteralPath参数(通常)通过属性名称接受管道的输入,具有-PSPath属性的输入对象会自动绑定,借助-LiteralPath参数别名。


如何发现此行为:

parameter description

  • 以编程方式:

    • 注意:.PSPath this 情况下也适用,但是这种方法通常仅限于基于MAML的帮助文件附带的目标命令,甚至包括那些可以具有与实际命令定义不同步的帮助文件。
PSPath

[*]是PowerShell的文件系统提供程序,其中添加了此属性。基本的.NET类型拥有它。有关更多信息,请参见this answer

答案 1 :(得分:3)

从“关于函数高级参数”文档中,ValueFromPipelineByPropertyName argument section

ValueFromPipelineByPropertyName参数表示 参数接受来自管道对象属性的输入。的 对象属性必须与参数具有相同的名称或别名。

例如,如果函数具有ComputerName参数,并且 管道对象具有ComputerName属性,其值 ComputerName属性分配给函数的ComputerName 参数。

更新:最初链接了错误的源代码文件。正确的Get-FileHash source code is here。在@mklement0 correctly answered中,Get-ChildItem cmdlet 输出具有PSPath属性的对象,从而可以完成此工作。

答案 2 :(得分:0)

看起来它使用了pspath属性。

dir there | select pspath | get-filehash

Algorithm  Hash                                                                Path
---------  ----                                                                ----
SHA256     44723DD4D0E0D46A3C7FA8ACA254B61C27B6B5789F96177E82C80700409F1535    C:\users\...