在PowerShell中访问$args数组

37

我有一个测试PowerShell V2脚本,看起来像这样:

    function test_args()
    {
      Write-Host "here's arg 0: $args[0]"
      Write-Host "here's arg 1: $args[1]"
    }


    test_args

如果我在PowerShell命令提示符中调用此命令,我将在屏幕上看到以下内容:

here's arg[0]: [0]

here's arg[1]: [1]

似乎不是我想要的。在使用它们之前,似乎我必须将$args [0]和$args [1]复制到脚本中的新变量中?如果我这样做,我就可以很好地访问这些内容。

有没有一种方法可以在我的代码中访问索引的$args?我尝试以各种方式使用花括号包围它们,但没有成功。

我最终会转向命名参数,但我正在处理的脚本(而不是此演示)是批处理文件的直接移植。


3
最终,这是一个字符串扩展(插值)语法问题,正如已被接受的答案所解释的那样。简单地说:要嵌入像$args[0]这样的 表达式 - 而不仅仅是像$var这样的变量引用 - 您需要使用子表达式运算符 $(...);因此:"... $($args[0]) ...".有关PowerShell字符串扩展规则的简洁概述,请参见此答案 - mklement0
1个回答

62

尝试使用以下代码:

function test_args()
{
  Write-Host "here's arg 0: $($args[0])"
  Write-Host "here's arg 1: $($args[1])"
}

test_args foo bar

请注意,应该使用 $args 而不是 $arg。同时,在字符串中使用PowerShell变量时,PowerShell仅替换变量的值。你不能直接使用像 $args[0] 这样的表达式。但是,你可以将表达式放在双引号字符串内的 $() 子表达式组中,以便让PowerShell评估表达式,然后将结果转换为字符串。


谢谢Keith--我更改了我的片段,以纠正从我的编辑器到SO的翻译中的拼写错误。 我想我的问题是,我需要将$arg [0]和[1]作为参数传递给test_args,还是函数本身将访问$args数组? - larryq
12
函数始终可以访问 $args。它将包含任何不映射到定义的函数参数的参数。如果没有参数或所有参数都映射到函数参数,例如 function foo($param1, $param2){},那么 $args 将是一个空数组。 - Keith Hill
有时候我必须使用 Out-String 来获取子表达式的输出以按预期显示...例如在使用哈希表时。示例,假设参数1是哈希表:Write-Host "这是参数1: $($args[1] | Out-String)" - VertigoRay
4
关于 $args 可用性的小提示:带有 [CmdletBinding()] 属性修饰的 param() 块或其参数带有 [Parameter()] 属性修饰的 高级 函数(或脚本)基本上不允许调用,除非传递的所有参数都绑定到 声明的 参数。换句话说:$args 不适用于高级函数和脚本。 - mklement0
我在函数n中使用$args {notepad $args},并用n argg_file调用它。这似乎是PowerShell功夫? - Timo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接