powershell - 为什么命令行参数直接放入脚本中的命令时不起作用?

标签 powershell

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

相关文章:

powershell - 我可以一次创建/声明多个相同类型的PowerShell对象吗?

Powershell 脚本默认值未显示在 Get-Help -full 中

git - 如何将其他文件添加到 Chocolatey 包中?

linq - PowerShell 等效于 LINQ Any()?

Powershell 脚本无法将 Register-ScheduledJob 作为 Azure 资源管理器 CustomScriptExtension 执行

powershell - 使用 Powershell 2 部署 Azure 项目时出现问题

windows - 仅在命令行中列出具有路径和文件大小的文件

powershell - 如果PowerShell不提供,如何使用OEM编码读取文件?

powershell - 读取 CSV 并在 PowerShell 中循环

python - 从文本文件中提取数字