Как использовать оператор вызова для передачи параметров в другой скрипт PowerShell - PullRequest
0 голосов
/ 30 января 2020

У меня есть сценарий 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

, который сам создает строку аргумента и выполняет ее. Я избежал кавычек из параметров и окружил параметры, которые содержат пробелы или точку с запятой с кавычками.

1 Ответ

0 голосов
/ 30 января 2020

Вы можете попытаться использовать индексы строкового массива вместо передачи самого массива, например так:

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

Обратите внимание, что скрипт все равно завершится ошибкой, если число переданных аргументов меньше, чем 4, и любой параметр после 4-го будет игнорироваться. Некоторая проверка также будет полезна, но это по крайней мере позволит вам передать параметры другому сценарию без ошибок.

РЕДАКТИРОВАТЬ:

После уточнения, не прибегая к командам Invoke, Единственный способ, о котором я могу думать, это сделать что-то вроде этого:

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

Вы можете попытаться проанализировать FileName и проверить, является ли он PS1 или нет, тогда либо используйте оператор вызова или запустите powershell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...