为何Resolve-Path -Relative输出通过管道传给Get-FileHash时运行异常
问题原因说明
- 第三条命令执行失败的核心逻辑:
Resolve-Path -Relative的输出是字符串类型的相对路径,而Get-FileHash默认接收管道传入的是FileInfo类型的文件对象,虽然它也支持字符串路径输入,但相对路径的参数绑定容易出现匹配错误;即使执行成功,Get-FileHash的原生输出结果也只会记录文件的绝对路径,无法满足你保留相对路径的需求。
现有实现代码的问题修正
你自己写的代码整体逻辑可行,存在2处可优化调整的点:
Where-Object里的正则写法错误:^*.exe属于无效正则表达式,通配符*需要匹配前置字符,匹配后缀为exe、dll的文件应该写成.*\.(exe|dll)$- 可以简化写法,无需先声明空字符串再构造自定义对象
修正后的代码如下:
Get-ChildItem -Path .\ -Recurse -File | Where-Object { $_.Name -match '.*\.(exe|dll)$' } | ForEach-Object { [PSCustomObject]@{ FileName = Resolve-Path -Relative $_.FullName SHA1 = (Get-FileHash $_.FullName -Algorithm SHA1).Hash } }
更简洁的单行管道实现
如果你偏好管道写法,也可以用下面的命令直接实现需求:
Get-ChildItem -Path .\subdir\ -Recurse -Filter *.* | Select-Object @{n='FileName';e={$_ | Resolve-Path -Relative}}, @{n='SHA1';e={$_ | Get-FileHash -Algorithm SHA1 | Select-Object -ExpandProperty Hash}}
内容的提问来源于stack exchange,提问作者ssh
相关产品推荐
相关产品推荐

