【发布时间】:2020-01-30 17:03:30
【问题描述】:
我有一个 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
这是我自己创建参数字符串并执行它。我从参数中转义了引号,并将包含空格或分号的参数括起来。
【问题讨论】:
-
你可能想看看
$PSBoundParameters>>> PSBoundParameters - PowerShell - SS64.com - ss64.com/ps/psboundparameters.html ValueFromRemainingArguments参数属性,并在$Args自动变量。 -
使用调用运算符
&,PowerShell 期望参数及其对应的参数用空格分隔。参数-参数对周围不应有引号。 -
@Lee_Dailey 我看了那些,但我看不出它们会有什么帮助。调用者脚本可以使用它们来收集要传递给被调用脚本的参数,但这并不能解决问题。
-
@Krajla - 啊!我误解了你的意图。 [blush] 我看到你找到了一种解决方法......很好! [咧嘴]
标签: powershell