我对Bash的了解要比对Powershell更为熟悉,有时我会对后者的对象模型感到困惑。
从documentation of Get-FileHash看,似乎有3种指定输入的方式:
前两个使用文件名,第三个使用数据流。
现在,根据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
期望的输入类型?
答案 0 :(得分:8)
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
参数别名。
如何发现此行为:
以编程方式:
.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\...