gpt4 book ai didi

powershell - 将参数数组传递给 powershell.exe

转载 作者:行者123 更新时间:2023-12-03 08:29:22 29 4
gpt4 key购买 nike

我有一个脚本需要 2 个数组作为输入,以及可选的日志名:

#file:test.ps1
Param(
[string[]]$array1,
[string[]]$array2,
[string]$logName = "log{0}.csv" -f (get-date -format "yyyyMMdd")
)

"array1: {0}" -f ($array1 -join " ")
"array2: {0}({1})" -f ($array2 -join " ") ,$array2.count
"logName: {0}" -f $logName

从 PowerShell 控制台运行时,一切正常:

PS D:\temp> .\test.ps1 -array1 one,two -array2 1,2,3array1: one twoarray2: 1 2 3(3)logName: log20190723.csv

但是当通过调用 powershell.exe 运行时(对于计划任务),只有数组中的第一个元素被抓取,其余的被传递给 logname 参数。

PS D:\temp> powershell.exe -F D:\temp\test.ps1 -array1 one,two -array2 1,2,3array1: onearray2: 1(1)logName: two

我应该如何定义参数以将所有参数抓取到数组中?

(顺便说一句:我使用的是 PS4.0,在 Windows 2008 和 2012 上的结果相同)

最佳答案

TL;DR:您不能跨进程边界传递 PowerShell 数组。


脚本的第一次调用在当前 PowerShell 进程中运行,因此 one,two1,2,3 作为 PowerShell 数组传递。

第二次调用您的脚本会启动第二个 PowerShell 进程作为外部程序,从而绕道离开并重新进入 PowerShell。因为 one,two1,2,3 作为字符串而不是数组传递给第二个 PowerShell 进程,因为 Windows 对 PowerShell 数组一无所知.

您可以在脚本开头以逗号分隔参数值以减轻此限制:

Param(
[string[]]$array1,
[string[]]$array2,
[string]$logName = "log{0}.csv" -f (Get-Date -Format "yyyyMMdd")
)

if ($array1.Count -eq 1) { $array1 = $array1.Split(',') }
if ($array2.Count -eq 1) { $array2 = $array2.Split(',') }

但是请注意,当您传递包含逗号的单个参数时,这可能会导致问题。


附录:您为第二次调用描述的行为应该仅在逗号前后有空格时发生:

PS C:\> powershell.exe -F C:\path\to\test.ps1 -array1 one, two -array2 1, 2, 3array1: onearray2: 1(1)logName: two

否则输出应该是这样的:

PS C:\> powershell.exe -F C:\path\to\test.ps1 -array1 one,two -array2 1,2,3array1: one,twoarray2: 1,2,3(1)logName: log20190723.csv

关于powershell - 将参数数组传递给 powershell.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57162074/

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