PowerShell Get-FileHash的括号和圆括号之间有什么区别?

时间:2019-06-10 04:22:56

标签: powershell

以下两个使用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 }

1 个答案:

答案 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)