0

我有两个 PowerShell 脚本,并在带有 PowerShell Core 的 Linux 上使用它们,并希望将 switch 参数从one.ps1to 传递给second.ps1,但是$args填充为一个字符串,其中包含TrueFalse子字符串,它不被 接受second.ps1,因为它有验证在参数块中。

我该如何更改才能使其正常工作?我知道我可以手动枚举所有的参数second.ps1并组成一个命令参数字符串,但是考虑到其中的参数太多second.ps1,有没有更好的方法?

我的脚本如下所示:

# one.ps1
param(
    [string][ValidateSet("value1", "value2")]$para1,
    [switch]$para3 = $false
)

Write-Host "one.ps1: para1=$para1"
Write-Host "one.ps1: para3=$para3"

Write-Host "args=$args"

pwsh ./second.ps1 $args

第二个.ps1

# second.ps1
param(
    [string][ValidateSet("value1", "value2")]$para1="value1",
    [string][ValidateSet("value3", "value4")]$para2="value3",
    [switch]$para3 = $false,
    [switch]$para4 = $false,
    [switch]$para5 = $false,
    [switch]$para6 = $false,
    [switch]$para7 = $false,
    [switch]$para8 = $false
)

Write-Host "second.ps1: para1=$para1"
Write-Host "second.ps1: para2=$para2"
Write-Host "second.ps1: para3=$para3"
Write-Host "second.ps1: para4=$para4"
Write-Host "second.ps1: para5=$para5"
Write-Host "second.ps1: para6=$para6"
Write-Host "second.ps1: para7=$para7"
Write-Host "second.ps1: para8=$para8"

这是使用它们的命令

pwsh one.ps1 -para1 value1 -para2 value3 -para3:true -para4:false

错误信息:

one.ps1: para1=value1
one.ps1: para3=True
args=-para2 value3 -para4 False
second.ps1: Cannot validate argument on parameter 'para1'. The argument "False" does not belong to the set "value1,value2" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.
4

2 回答 2

0

很抱歉,但我认为将$args第二个脚本作为命名参数传递不会那么容易。$args是一个参数数组。每个参数由空格分隔。当您传递$args给第二个脚本时,它将被计为位置一的一个参数。$para1第二个脚本将整个数组作为其位置参数。

function one 
{# one.ps1
    param(
        [string][ValidateSet("value1", "value2")]$para1,
        [switch]$para3 = $false
    )

    Write-Host "one.ps1: para1=$para1"
    Write-Host "one.ps1: para3=$para3"

    Write-Host "args=$args"
    Write-Host "argsType=$($args.GetType().BaseType)"

    $args
}

$arg = one -para1 value1 -para2 value3 -para3:$true -para4:$false

结果:

one.ps1: para1=value1
one.ps1: para3=True
args=-para2 value3 -para4: False
argsType=array

PS D:\test> $arg
-para2
value3
-para4:
False

如您所见-para2 value3,不是单个字符串,而是作为数组的一部分的两个字符串。您可以编写代码来重建命名参数字符串,但我认为这将比仅仅枚举它们更多工作。另一种解决方案是使用splatting。但是,您必须为第一个脚本提供一个哈希表,而不仅仅是一个字符串。这是一种 通过 splatting 使用 args 调用另一个函数的方法。

于 2021-06-09T08:59:39.130 回答
0

splat$PSBoundParameters传递绑定到声明参数的参数,one.ps1splat$args传递其余参数:

# one.ps1
param(
    [string][ValidateSet("value1", "value2")]$para1,
    [switch]$para3 = $false
)

Write-Host "one.ps1: para1=$para1"
Write-Host "one.ps1: para3=$para3"

Write-Host "args=$args"

pwsh ./second.ps1 @PSBoundParameters @args
于 2021-06-09T09:24:57.720 回答