Как передать несвязанные аргументы из одного скрипта в качестве параметров другому? - PullRequest
0 голосов
/ 26 сентября 2019

У меня небольшой опыт работы с PowerShell, в частности.

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

Сценарий, который я пытаюсь получить, выглядит (я думаю) следующим образом:

#common.ps1:
param(
    # Sure'd be great if clients didn't need to know about these
    $some_params_here
    ...
)

function Common-Func-Uses-Params {
   ...
}

⋮
# foo/bar/bat.ps1:

# sure would love not to have to redefine all the common params() here...

. common.ps1 <pass-the-arguments>

Common-Func-Uses-Params $specific_Foo/Bar/Bat_Data

Как показывают вышеприведенные псевдо-комментарии, я смог сделать это до сих пор только путем сбора параметров в вызывающем скрипте.

Я хочу оказаться в ситуации, когда я могу обновить общий код (скажем, с помощью -Debug или -DryRun или -Url или любого другого параметра) и не беспокоиться об обновлении всего клиентасоответствующий код.

Возможно ли это?

1 Ответ

1 голос
/ 26 сентября 2019

Вам не хватает двух ключевых вещей:

  • args - который захватывает все (и только) несвязанные аргументы скрипта
  • splatting (@) - который используется для передачи массивов или хеш-таблиц в команду, а не для их выравнивания, как если бы вы получили $

Когда вы объединяете их, вы можете легко передать все аргументы в другой скрипт, например, так:

# foo.ps1

. common.ps1 @args

С источником файла, подобным этому:

#common.ps1

param ([string]$foo = "foo")
echo "`$foo is $foo"

Вы получаете следующие выходные данные:

> foo.ps1 возвращает $foo is foo

> foo.ps1 -Foo bar возвращает $foo is bar


Обратите внимание, что если вы пытаетесьиспользуйте PowerShell ISE, чтобы выяснить это или отладить что-либо из этого, может потребоваться некоторое время.Когда вы находитесь в отладчике, $ args и $ MyInvocation.UnboundArguments приложат все усилия, чтобы скрыть эту информацию от вас.Они будут казаться полностью пустыми.

Вы можете напечатать аргументы с помощью >> echo "$(@args)", но это также обеспечивает очень странный побочный эффект при отладчике продолжать.Я думаю, что сплаттинг добавляет дополнительную новую строку, и это заканчивается в Командном окне.

Лучший обходной путь, который у меня есть для этого, это добавить $theargs = $args вверху вашего скрипта и не забывать использовать $theargsв отладчике.

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