使用PowerShell Get-ChildItem获取目录中的所有文件

时间:2019-06-28 15:04:10

标签: powershell

我一直在使用以下命令来获取目录(及其所有子目录)中所有文件的MD5哈希值:

Get-FileHash -Algorithm MD5 -LiteralPath (Get-ChildItem "*.*" -Recurse)

但是,我意识到一些子目录具有不带文件扩展名的文件。

以下两个命令之间有什么区别,并且是获取目录中所有文件(包括不带文件扩展名的文件)的好方法吗?对于我的测试目录,它们的输出似乎相同,但是只有第一个作为Get-FileHash cmdlet的输入。

Get-ChildItem "*" -Recurse

Get-ChildItem -Recurse | where {!$_.PsIsContainer}

编辑:谢谢Mathias,它们似乎都可以与Get-FileHash一起使用(包括没有文件扩展名的文件以及文件名中带有方括号的文件):

Get-FileHash -Algorithm MD5 -LiteralPath (Get-ChildItem "*" -Recurse)

Get-ChildItem -Recurse | where {!$_.PsIsContainer} | Get-FileHash -Algorithm MD5

1 个答案:

答案 0 :(得分:0)

它有助于发布错误消息。如果您真的想用这种方法,那就可以用。这是PS 5令人讨厌的问题的一部分,其中get-childitem返回的字符串版本不是完整路径。奇怪的是*。*返回完整路径。一种解决方法是在此之后将其通过管道传递到get-item。

get-filehash -Algorithm MD5 -LiteralPath (Get-ChildItem -Recurse | get-item | 
where {!$_.PsIsContainer})

另一种方式。 Get-ChildItem现在具有-File选项。并获取全名。

get-filehash -Algorithm MD5 -LiteralPath (Get-ChildItem -Recurse -File).fullname

问题的简单演示:

get-childitem * -recurse | foreach-object { "$_" }

foo2
hi.doc
hi2.doc


get-childitem *.* -recurse | foreach-object { "$_" }

C:\Users\js\foo\foo2\hi2.doc
C:\Users\js\foo\hi.doc