У меня есть ситуация, в которой у меня есть 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 для любой помощи!