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)
解释为什么会这样会很棒。
解决方案
PowerShell 中的每个脚本块( { ... }
) 都有自己的自动$args
数组副本,其中自动收集按位置传递的参数。
因此,$args
inside{$_.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"
,因为.Id
process 对象的属性是一个数字(类型[int]
)。
退后一步,我建议在脚本中声明参数,这比使用更可取 - 保存此类参数值的变量可以在脚本块$args
中毫无问题地使用。Where-Object
一般来说:
$args
只有在您使用参数调用的脚本块内部访问才有意义,而在传递给的脚本块中情况并非如此,其中脚本块Where-Object
的输入(仅)来自管道,通过自动$_
变量相比之下,您可以将参数传递给脚本块,如果您使用调用运算符
&
调用它,例如: yield 。& { "[$args]" } 'foo'
[foo]
推荐阅读
- c# - Specflow - 在特征文件中使用来自外部文件的数据
- github - 如何修复在 URI 'https://api.github.com/repos/actions/checkout/tarball/v1 中找不到操作
- angular - 如何在 mat-stepper 中销毁组件
- c# - c# WPF 用户控制代码隐藏如何交互到 MainWindow 代码隐藏?
- javascript - 如何在 vue 应用程序中使用独立的 vue 库?
- microsoft-graph-api - 上传同名文件时不要替换现有文件 Microsoft Graph API
- java - 是否可以用 maven 模仿 gradle 构建风味?
- amazon-web-services - 未触发 lambda 持续时间的 Cloudwatch 警报
- html - 如何在此表中再添加一个方格?
- python - 在管道中使用缩放时,如何将缩放应用于选定的功能?