如何访问 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 一个(新)数组,包含输入数组的 first 和 last 元素(假设数组至少有两个元素)。
..
,range operator对于提取一系列连续元素特别有用。例如,$args[0..2]
returns 包含前 3 个元素(索引为 0
、1
和 2
的元素)的(新)数组。
您甚至可以 组合 具有范围 的单个索引,由 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]
我有以下代码:
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 一个(新)数组,包含输入数组的 first 和 last 元素(假设数组至少有两个元素)。
..
,range operator对于提取一系列连续元素特别有用。例如,$args[0..2]
returns 包含前 3 个元素(索引为 0
、1
和 2
的元素)的(新)数组。
您甚至可以 组合 具有范围 的单个索引,由 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]