看起来这应该很简单。
get-childitem -path "E:\Test 1" -Recurse -File | foreach-Object { $fsize=(get-Item $_.FullName).Length ; $hash=(get-FileHash $_.Fullname -Algorithm MD5 | Select-Object Hash,Path ); write-host $fsize $hash }
这将产生如下输出:
18 @{Hash=2FC4C77B6792F3DA856E77486F849105; Path=E:\Test 1\file 1.txt}
现在我只想显示文件大小、文件哈希、文件路径。
我知道我可以将
-ExpandProperty
用于单个属性,但如何同时扩展哈希和路径?
这仅适用于哈希:
get-childitem -path "E:\Test 1" -Recurse -File | foreach-Object { $fsize=(get-Item $_.FullName).Length ; $hash=(get-FileHash $_.Fullname -Algorithm MD5 | Select-Object Hash,Path -ExpandProperty Hash); write-host $fsize $hash }
结果是:
18 2FC4C77B6792F3DA856E77486F849105
但是你不能将
-ExpandProperty
与多个值一起使用
get-childitem -path "E:\Test 1" -Recurse -File | foreach-Object { $fsize=(get-Item $_.FullName).Length ; $hash=(get-FileHash $_.Fullname -Algorithm MD5 | Select-Object Hash,Path -ExpandProperty Hash,Path); write-host $fsize $hash }
如何提取路径,使其显示如下?
18 2FC4C77B6792F3DA856E77486F849105 E:\Test 1\file 1.txt
预先感谢您对我的耐心和帮助。
您不需要调用
Get-Item
来检索文件的 Length
- 您已经从 Get-ChildItem
获得了完全相同的信息。
为了从附加到每个文件的
Get-FileHash
获取多个属性值,而不必为每个文件多次调用 Get-FileHash
,您可以连续使用 Select-Object
两次,首先从 Get-FileHash
提取输出,然后使用 -ExpandProperty
来反对:
$files = Get-ChildItem -Path "E:\Test 1" -Recurse -File
$lengthAndHashObject = $files |Select Length,@{Name='FileHashOutput';Expression={$_ |Get-FileHash |Select-Object Hash,Path}}
$finalObjects = $lengthAndHashObject |Select Length -ExpandProperty FileHashOutput
# or as a single pipeline:
Get-ChildItem -Path "E:\Test 1" -Recurse -File |Select Length,@{Name='FileHashOutput';Expression={$_ |Get-FileHash |Select-Object Hash,Path}} |Select Length -ExpandProperty FileHashOutput
从
Path
获得的 Get-FileHash
值也不是真正必要的 - 您已经从文件信息对象上的 FullName
属性获得了相同的信息,并且可以使用 Select-Object
执行一次传递:
Get-ChildItem -Path "E:\Test 1" -Recurse -File |Select Length,@{Name='Path';Expression='FullName'},@{Name='Hash';Expression={$_ |Get-FileHash |ForEach-Object Hash}}