首页 > 解决方案 > 如何使用调用运算符将​​参数传递给另一个 PowerShell 脚本

问题描述

我有一个 PowerShell 脚本,它将参数收集到一个数组中,然后尝试使用这些参数调用一个可执行文件。

param(
    [String] $FileName,
    [Parameter(ValueFromRemainingArguments=$true)][String[]] $Arguments
)

& $FileName $Arguments

这在调用简单的可执行文件时效果很好,但在尝试调用另一个需要多个参数的 PowerShell 脚本时会抛出错误。

例外: 无法处理参数“a”的参数转换。无法将值转换为 System.String 类型。

param(
    [parameter(mandatory = $true)][string]$a,
    [parameter(mandatory = $true)][string]$b,
    [parameter(mandatory = $true)][string]$c,
    [parameter(mandatory = $true)][string]$d
)

Write-Output ($a + " - " + $b + " - "+ $c + " - "+ $d)

参数的数量是可变的。

我的猜测是,调用运算符(将被调用文件视为 PowerShell 脚本)尝试将数组作为对象传递,而不是拆分参数。我不一定要求助于Invoke-Expression,因为一些参数是由用户提供的,它可能会带来风险

编辑: 我最终做了类似于 Jimmy Robitaille 建议的事情。

$Command = "& $FileName"
foreach ($Arg in $Arguments) {
    $Arg = $Arg.Replace("`"", "```"")
    if ($Arg.Contains(' ') -or $Arg.Contains(';')) {
        $Command += " `"$Arg`""
    }
    else {
        $Command += " $Arg"
    }
}
Invoke-Expression $Command

这是我自己创建参数字符串并执行它。我从参数中转义了引号,并将包含空格或带引号的分号的参数包围起来。

标签: powershell

解决方案


您可以尝试使用字符串数组的索引而不是传递数组本身,如下所示:

& $FileName $Arguments[0] $Arguments[1] $Arguments[2] $arguments[3]

请注意,如果传递的参数数量少于 4 个,脚本仍然会失败,并且任何超过第 4 个的参数都将被忽略。一些验证也会有所帮助,但这至少可以让您将参数传递给其他脚本而不会出错。

编辑:

在澄清之后,不诉诸调用命令,我能想到的唯一方法是做这样的事情:

powershell.exe `"$FileName`" $($Arguments -join ' ')

您可以尝试解析 FileName 并检查它是否为 PS1,然后使用呼叫运算符或启动 powershell。


推荐阅读