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

PowerShell Get FileHash的管道和圆括号之间有什么区别?,powershell,Powershell,以下两个使用Get-FileHash cmdlet的命令似乎给出了相同的结果(对目录及其子目录中的所有文件进行md5哈希)。我想知道,除了字符数之外,在文件路径列表中使用管道和在Get-FileHash cmdlet中使用圆括号是否有什么区别 Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse) Get-ChildItem "*.*" -Recurse | Get-FileHash -Algorithm MD5 此外

以下两个使用Get-FileHash cmdlet的命令似乎给出了相同的结果(对目录及其子目录中的所有文件进行md5哈希)。我想知道,除了字符数之外,在文件路径列表中使用管道和在Get-FileHash cmdlet中使用圆括号是否有什么区别

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

Get-ChildItem "*.*" -Recurse | Get-FileHash -Algorithm MD5
此外,我尝试了十几次使用Measure命令对命令进行计时(基于这个问题;我不知道PowerShell中还有更具统计意义的方法)——在我的系统上的同一个小目录上,圆括号版本通常需要8到9毫秒,管道版本需要9到10毫秒

Measure-Command { Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse) }

Measure-Command { Get-ChildItem "*.*" -Recurse | Get-FileHash -Algorithm MD5 }

在更大的样本量上运行,根据您的意愿进行此操作。将GCI分配给一个变量,然后将其用作
Get FileHash
参数似乎更快

也如评论中所述。括号中是一个数组,其中as管道将“推”每个对象到函数。配管通常较慢

将这些数据运行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)

第1个版本读取较高优先级perens部分中的文件,并将其放入
-Path
参数值中。第二个命令将文件信息和管道传输到cmdlet,在cmdlet中它被接受
byName
byValue
-Path
参数中如果文件集很大,则第1个会更快,因为它避免了管道[slow ish]和为推断参数赋值所需的解析。在我看来,管道将把每个文件对象传递给
Get FileHash
函数,其中,括号内的命令版本将在对象数组中运行。我现在用更大的样本量来证实这一点。