我很难理解为什么在这个命令中直接使用 $args[$i] 不起作用。它给出了一个完全错误的答案。
$memory=$(Get-Process | Where-Object {$_.id -eq "$($args[$i])"} | select -expand VirtualMemorySize64)
但是,将命令行参数放入另一个变量并使用该变量是可行的。
$id=($args[$i])
$memory=$(Get-Process | Where-Object {$_.id -eq "$id"} | select -expand VirtualMemorySize64)
如果能解释一下为什么会这样就太好了。
最佳答案
每个 script block PowerShell 中的 ({ ... }
) 有自己的自动 $args
数组副本,其中会自动收集按位置传递的参数。
因此,{$_.id -eq "$($args[$i])"}
内的 $args
是不是与脚本级别的 $args
相同,因此您确实需要首先将脚本级值保存在辅助变量中,如第二个代码段所示,可以按如下方式简化:
# Must use aux. variable to access the script-level $args inside
# the Where-Object script block.
$id = $args[$i]
$memory = Get-Process | Where-Object { $_.id -eq $id } |
Select-Object -ExpandProperty VirtualMemorySize64
请注意,没有多余的 (...)
和 $(...)
,并删除了 "$id"周围的引号
code>,假定流程对象的 .Id
属性是一个 数字(类型 [int]
)。
退后一步,我建议在脚本中声明参数,这比使用 $args
更好 - 保存此类参数值的变量可以在不使用的情况下使用Where-Object
脚本 block 中存在问题。
一般情况下:
仅在您使用参数调用的脚本 block 内访问
$args
才有意义,而在传递的脚本 block 中则不是这种情况至Where-Object
,其中脚本 block 的输入(仅)来自管道,通过 automatic$_
variable相比之下,如果使用
&
调用脚本 block ,则可以将参数传递给脚本 block ,即 call operator ,例如:& { "[$args]"} 'foo'
产生[foo]
。
关于powershell - 为什么命令行参数直接放入脚本中的命令时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61042603/