以下两个使用Get-FileHash cmdlet的命令似乎给出了相同的结果(目录及其子目录中所有文件的md5哈希)。我想知道文件路径列表中的管道与除字符数以外对Get-FileHash cmdlet使用圆括号之间是否有区别?
Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse)
Get-ChildItem "*.*" -Recurse | Get-FileHash -Algorithm MD5
此外,我尝试用Measure-Command计时大约十几次(基于这个问题Timing a command's execution in PowerShell;我不知道PowerShell中具有统计意义的更有效的方法)-还是一样目录中的圆括号版本通常需要8到9毫秒,而管道版本需要9到10毫秒。
Measure-Command { Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse) }
Measure-Command { Get-ChildItem "*.*" -Recurse | Get-FileHash -Algorithm MD5 }
答案 0 :(得分:0)
以更大的样本量运行,按照您的意愿进行操作。似乎将GCI分配给变量然后将其用作Get-FileHash
参数是更快的。
也如评论中所述。放在方括号中的是一个数组,通过管道将每个对象“推”到函数中。管道通常比较慢。
对这些数字进行15次左右运算,并保留最后的结果,因为它们非常相似。
(Get-ChildItem "*.*" -Recurse).Count
(Measure-Command { Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse) }).TotalSeconds
(Measure-Command { Get-ChildItem "*.*" -Recurse | Get-FileHash -Algorithm MD5 }).TotalSeconds
(Measure-Command { $Test = Get-ChildItem "*.*" -Recurse}).TotalSeconds + (Measure-Command {(get-FileHash -Algorithm MD5 $Test)}).TotalSeconds
# Total Files: 5244
# Seconds to run Bracketed GCI: 18.3848352
# Seconds to run Piped GI: 19.751385
# Seconds to run GCI to Object + Paramed hash: 17.5382904 (1.3471413 + 16.1911491)