gpt4 book ai didi

arrays - 我如何有一个从 args 或 Powershell 管道中获取输入的数组参数?

转载 作者:行者123 更新时间:2023-12-04 17:27:03 25 4
gpt4 key购买 nike

我正在尝试编写一个接受数组参数的 Powershell 函数。我希望使用数组作为参数或管道输入调用它。所以,调用看起来像这样:

my-function -arg 1,2,3,4
my-function 1,2,3,4
1,2,3,4 | my-function

获得前两个很容易:
function my-function {
param([string[]]$arg)
$arg
}

然而,对于管道输入,它更难。通过使用 ValueFromPipeline,可以轻松地在进程块中一次获取一个参数,但这意味着 $args 变量是具有管道输入的单个值,但如果使用 -args 则是一个数组。我可以在 END 块中使用 $input ,但这根​​本不会获得 -args 输入,并且在 END 块中使用 $args 只能从管道中获取最终项目。

我想我可以通过使用 begin/process/end 块从管道中显式收集参数值来做到这一点,如下所示:
function my-function {
param([Parameter(ValueFromPipeline=$true)][string[]]$args)

begin {
$a = @()
}
process {
$a += $args
}

end {
# Process array here
$a -join ':'
}
}

但这似乎非常困惑。这对我来说似乎也是一个相对常见的要求,所以我希望它很容易实现。有没有我错过的更简单的方法?或者如果没有,有没有办法将参数处理封装到一个子函数中,这样我就不必在我想要像这样工作的每个函数中都包含所有这些?

我的具体要求是我正在编写将 SQL 命令作为输入的脚本。因为 SQL 可能很冗长,所以我希望允许在命令中进行管道传输(可能由另一个命令生成,或从文件中的 get-contents 生成),但也允许使用参数形式,以便快速 SELECT 语句。所以我从管道中获取了一系列字符串,或者作为参数。如果我得到一个数组,我只想将它与“`n”连接起来形成一个字符串——逐行处理是不合适的。

我想另一个问题是,是否有更好的脚本设计可以使多行输入变得更清晰?

谢谢 - 诀窍是不要使用 ValueFromPipeline 那么......

我在让事情按照我想要的方式工作时遇到这么多麻烦的原因是,在我的测试脚本中,我使用 $args 作为我的参数变量的名称,忘记了它是一个自动变量。所以事情非常奇怪......
PS> 1,2,3,4 | ./args

PS> get-content args.ps1
param([string[]]$args)

if ($null -eq $args) { $args = @($input) }
$args -join ':'

多 :-)

最佳答案

使用自动变量 $input .

如果只需要管道输入,则:

function my-function {
$arg = @($input)
$arg
}

但我经常使用这种组合方法(一个接受输入作为参数或通过管道的函数):
function my-function {
param([string[]]$arg)

# if $arg is $null assume data are piped
if ($null -eq $arg) {
$arg = @($input)
}

$arg
}


# test
my-function 1,2,3,4
1,2,3,4 | my-function

关于arrays - 我如何有一个从 args 或 Powershell 管道中获取输入的数组参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7435613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com