如何在表达式中使用 cmdlet

How to use cmdlet inside an expression

中所述,我想要目录中文件列表的名称和文件版本。

直到现在,多亏了Theo,我已经有了这个:

$result = 
  Get-ChildItem -Path 'X:\path with spaces' | 
    Where-Object {$_.Extension -match '\.(dll|exe)'} |
    Select-Object Name, 
                  @{Name = 'FileVersion'; 
                    Expression = {$_.VersionInfo.FileVersion}}

现在我想给它加上校验和。
为了实现这一点,这是我尝试过的:

$result = 
  Get-ChildItem -Path 'X:\path with spaces' | 
    Where-Object {$_.Extension -match '\.(dll|exe)'} |
      Select-Object Name, 
                    @{Name = 'FileVersion'; 
                      Expression = {$_.VersionInfo.FileVersion}}, 
                    @{Name = 'CheckSum'; 
                      Expression = {Get-FileHash($_).Hash}}

所以,基本上,我添加了另一个带有名称和表达式的“东西”,我试图添加它(以防这看起来很荒谬:这是我的第一个 Powershell 日:-))。
这不起作用,但没有错误消息:就好像校验和的问题根本不存在。

有人知道我该如何解决这个问题吗?
提前致谢

您的代码实际上给出了一个错误,但是 表达式脚本块 中的错误被悄悄地忽略了。参见官方文档的Notes

PS /> @{} | Select-Object @{Name = 'Something'; Expression = { throw }}

Something
---------

如果您检查 $Error automatic variable,您可能会看到如下内容:

PS /> $Error[0]

Get-FileHash: Cannot bind argument to parameter 'Path' because it is null.

正确的表达方式应该是:

Expression = {(Get-FileHash $_.FullName).Hash}