首页 > 解决方案 > 为什么直接放入脚本中的命令时命令行参数不起作用?

问题描述

我很难理解为什么在此命令中直接使用 $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)

解释为什么会这样会很棒。

标签: powershell

解决方案


PowerShell 中的每个脚本块( { ... }) 都有自己的自动$args数组副本,其中自动收集按位置传递的参数。

因此,$argsinside{$_.id -eq "$($args[$i])"}与脚本级别的不同$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

请注意没有多余的(...)and $(...),并且删除了周围的引号"$id",因为.Idprocess 对象的属性是一个数字(类型[int])。

退后一步,我建议在脚本中声明参数,这比使用更可取 - 保存此类参数值的变量可以在脚本块$args中毫无问题地使用。Where-Object


一般来说:

  • $args只有在您使用参数调用的脚本块内部访问才有意义,而在传递给的脚本块中情况并非如此,其中脚本块Where-Object的输入(仅)来自管道,通过自动$_变量

  • 相比之下,您可以将参数传递给脚本块,如果您使用调用运算符&调用它,例如: yield 。& { "[$args]" } 'foo'[foo]


推荐阅读