如何访问 PowerShell 脚本中的最后一个参数 (args)

How to access last argument in PowerShell script (args)

我有以下代码:

foreach ($arg in $args) {
        Write-Host "Arg: $arg";
        $param1=$args[0]
}
Write-host "Number of args: " $args.Length
write-host Last Arg is: "$($args.count)"




我明白了,当我 运行 它时:

./print_last_arg.ps1 a b c
Arg: a
Arg: b
Arg: c
Number of args:  3
Last Arg is: 3


我想要的是最后一个参数的名称,所以:

Last Arg is: 3

应该是:

Last Arg is: c

很抱歉提出这样一个愚蠢的问题,但我完全是 PS 的初学者,无法 google 结果...

PowerShell 支持 negative 索引来引用集合 end 中的元素,从 [=13] 开始=] 引用 last 元素-2 引用倒数第二个(倒数第二个)元素,依此类推。

因此,使用 $args[-1] 来引用最后传递的参数。

有关详细信息,请参阅概念性 about_Arrays 帮助主题。


注意你也可以使用表达式的结果作为索引;例如,$args[-1] 等价于 $args[$args.Count-1](假设数组至少有一个元素)。

此外,您可以指定多个 索引来提取任意元素的子数组。例如,$args[0, -1] returns 一个(新)数组,包含输入数组的 firstlast 元素(假设数组至少有两个元素)。

..range operator对于提取一系列连续元素特别有用。例如,$args[0..2] returns 包含前 3 个元素(索引为 012 的元素)的(新)数组。

您甚至可以 组合 具有范围 的单个索引,由 PowerShell 的 + 运算符执行(平面)数组 串联。 例如,$args[0..2 + -1] 提取前 3 个元素以及最后一个元素(假设至少有 4 个元素)。

  • 注意:由于句法原因,如果单个索引在索引表达式中出现在前面,则需要将其设为array, 的一元形式 array constructor operator,以确保 + 执行 array 连接;例如,$args[,-1 + 0..2] 提取最后一个元素,然后提取前 3 个元素。

陷阱..起点与负相结合 到最后第 N 个元素逻辑的终点 按预期工作:

假设数组如下:

$a = 'first', 'middle1', 'middle2', 'last'

很容易使用范围表达式 1..-2 来提取“中间”的所有元素,即从第二个元素开始到倒数第二个元素 - 但这确实 not 按预期工作:

# BROKEN attempt to extract 'middle1', 'middle2'
PS> $a[1..-2]
middle1
first
last
middle2

原因是1..-2作为一个纯算术范围表达式,扩展为下面的数组(其元素恰好被用作另一个数组的索引) :1, 0, -1, -2。而提取出来的就是这些元素:第2个,第一个,最后一个,倒数第二个。

避免这个问题,您需要提前知道数组的元素计数,并使用表达式 将范围的结束指定为 positive number:

# OK: extract 'middle1', 'middle2'
# Note that the verbosity and the need to know $a's element count.
PS> $a[1..($a.Count-2)]
middle1
middle2

不幸的是,这既冗长又不方便,特别是考虑到您可能想要对您计算的集合进行操作事先不知道

GitHub issue #7940 proposes a future enhancement to better support this use case with new syntax, analogous to C#'s indices-and-ranges feature,这样上面的写法就更方便了$a[1..^1]