У меня есть сценарий 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 , так как некоторые аргументы предоставляются пользователем, и это может представлять риск
EDIT: Я закончил тем, что сделал что-то похожее на то, что предложил Джимми Робитейл.
$Command = "& $FileName"
foreach ($Arg in $Arguments) {
$Arg = $Arg.Replace("`"", "```"")
if ($Arg.Contains(' ') -or $Arg.Contains(';')) {
$Command += " `"$Arg`""
}
else {
$Command += " $Arg"
}
}
Invoke-Expression $Command
, который сам создает строку аргумента и выполняет ее. Я избежал кавычек из параметров и окружил параметры, которые содержат пробелы или точку с запятой с кавычками.