我对 Bash 比对 Powershell 更熟悉,有时我对后者的对象模型感到困惑。
查看Get-FileHash的文档,似乎有 3 种指定输入的方法:
前两个取文件名,第三个取数据流。
现在,Get-ChildItem -File似乎输出System.IO.FileInfo对象,从什么Get-Member说:
$ Get-ChildItem -File | Get-Member
TypeName: System.IO.FileInfo
Run Code Online (Sandbox Code Playgroud)
然而管道Get-ChildItem -File | Get-FileHash工作正常。我的问题是,允许转换System.IO.FileInfo为预期的输入类型的机制是什么Get-FileHash?
System.IO.FileInfo/ System.IO.DirectoryInfoPowerShell cmdlet 输出的实例具有一个.PSPath属性[*] ,其中包含实例的完全限定路径,即以 PS 提供程序名称(例如,Microsoft.PowerShell.Core\FileSystem::C:\windows)为前缀的完整文件系统路径。
文件处理的cmdlet,例如Get-FileHash有一个-LiteralPath参数,它有一个别名-PSPath。
因为-LiteralPath参数(通常)通过属性名称接受来自管道的输入,所以具有.PSPath属性的输入对象会根据PSPath参数别名自动绑定到它。
如何发现这种行为:
以编程方式:
PS> & {
Get-Command $args[0] | % Parameters | % $args[1] |
Select-Object Name, Aliases, @{
n = 'Accepts pipeline input';
e = { $(if ($_.Attributes.ValueFromPipeline) { 'by value' }), $(if ($_.Attributes.ValueFromPipelineByPropertyName) { 'by property name' }) -join ', ' -replace '^, ' }
}
} Get-FileHash LiteralPath
Name Aliases Accepts pipeline input
---- ------- ----------------------
LiteralPath {PSPath, LP} by property name
Run Code Online (Sandbox Code Playgroud)
[*] PowerShell 的文件系统提供程序添加了此属性等。底层的 .NET 类型没有它。有关更多信息,请参阅此答案。
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |