Передача именованных параметров из одного сценария powershell в другой - PullRequest
1 голос
/ 04 ноября 2019

У меня есть ситуация, в которой у меня есть script_1.ps1, который вызывается напрямую пользователем. Script_1.ps1 на самом деле является просто точкой входа (как минимум, предоставляющей только жестко запрограммированное значение конфигурации) для script_2.ps1, который содержит общую, разложенную логику. Я хочу, чтобы пользователь мог передавать любые или все необходимые аргументы в script_1, который, в свою очередь, должен передавать в script_2. Если не все обязательные параметры передаются пользователем, в script_2 есть логика, которая будет запрашивать у пользователя информацию.

В моей идеальной настройке я бы сделал так, чтобы script_1 принимал именованные параметры от пользователя, а затемscript_2 принимает именованные параметры из script_1. Например, мой script_1.ps1 будет выглядеть примерно так:

param (
    [switch] $Help = $false,
    [switch] $Quiet,
    [string] $Param1,
    [string] $Param2,
    [Parameter(Position=0, ValueFromRemainingArguments=$true)] $args
)

if (!$Help) {
    .\script_2.ps1 -ServiceName "Service name here" #also pass any other args that were set by user (may be none, several, or all)
}

Тогда мой script_2.ps1 будет выглядеть примерно так:

param (    
    [switch] $Quiet,
    [Alias("l")]
    [string] $ServiceName,
    [string] $Param1,
    [string] $Param2,
    [Parameter(Position=0, ValueFromRemainingArguments=$true)] $args
)

# do things with arguments here

Возможно ли достичь этого без перечислениявсе аргументы, когда я вызываю script_2.ps1 из script_1.ps1? Мой script_1 имеет около 20 различных возможных параметров, поэтому что-то вроде этого будет довольно быстро запутаться:

.\script_2.ps1 -ServiceName "Service name here" -Quiet $Quiet -Param1 $Param1 -Param2 $Param2 

Самое близкое, что я получил к этой работе, это следующее, но затем он обрезает аргументы с помощьюпробелы к тому времени, когда они добираются до script_2. Помещение экранированных кавычек вокруг $ args приводит к тому, что аргументы не передаются.

param (
    [switch] $Help = $false,
    [Parameter(Position=0, ValueFromRemainingArguments=$true)] $args
)

if (!$Help) {
    Start-Process -FilePath powershell.exe -ArgumentList "-file `".\script_2.ps1`" -ServiceName `"Service name here`" $args"
}

Я уверен, что мне не хватает трюка, чтобы сделать это как относительный новичок в powershell ... TIA для любой помощи!

1 Ответ

2 голосов
/ 05 ноября 2019

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

К счастью, есть встроенная хеш-таблица, которая уже содержит параметры, переданные вскрипт или функция - $PSBoundParameters - так что вы можете просто разделить это прямо с script1.ps1 на script2.ps1 ...

Обратите внимание, что вы вызываете "восклицательный знак" с символом @,не $ - то есть @PSBoundParameters в данном случае.

script.ps1

param (
    [switch] $Help = $false,
    [switch] $Quiet,
    [string] $Param1,
    [string] $Param2,
    [Parameter(Position=0, ValueFromRemainingArguments=$true)] $args
)

if (!$Help) {
    write-host "script1.ps1"
    write-host ($PSBoundParameters | ft | out-string);
    . .\script2.ps1 @PSBoundParameters
}

script2.ps1

param (    
    [switch] $Quiet,
    [Alias("l")]
    [string] $ServiceName,
    [string] $Param1,
    [string] $Param2,
    [Parameter(Position=0, ValueFromRemainingArguments=$true)] $args
)

# do things with arguments here
write-host "script2.ps1"
write-host ($PSBoundParameters | ft * | out-string)

Если вы затем позвоните:

C:\> powershell .\script1.ps1 -Param1 "aaa" -Quiet:$true

, вы получите такой вывод:

script1.ps1

Key    Value
---    -----
Param1 aaa
Quiet  True

script2.ps1

Key    Value
---    -----
Param1 aaa
Quiet  True

и если вам не нравится встроенная $PSBoundParameters хэш-таблица, выможете создать свой собственный и вместо этого:

$mySplat = @{
    "Quiet" = $true
    "Param1" = "myParam1"
}
$mySplat.Add("Param2", "myParam2")
$mySplat.Remove("Quiet");
. .\script2.ps1 @mySplat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...