Использование функции источника точки в параметрах - PullRequest
3 голосов
/ 08 января 2020

Вначале я скажу, что я все еще довольно сильная ладья ie в PowerShell и надеюсь, что есть способ сделать это.

У нас есть сценарий utils.ps1, содержащий только те функции, с которыми мы добавляем источник в других сценариях. Одна из функций возвращает значение по умолчанию, если значение не передается. Я знаю, что могу проверить $ args и тому подобное, но я хотел использовать функцию для значения по умолчанию в параметрах.

param(
    [string]$dbServer=$(Get-DefaultParam "dbServer"), 
    [string]$appServer=$(Get-DefaultParam "appServer")
)

Это не работает, так как сценарий Util еще не был получен. Я не могу поставить точечный источник первым, потому что тогда params не работает, так как это не верхняя строка. Утилиты не являются модулем, и я не могу использовать #require.

То, что я получил, работало так:

param(
    [ValidateScript({ return $false; })]
    [bool]$loadScript=$(. ./Utils.ps1; $true),
    [string]$dbServer=$(Get-DefaultParam "dbServer"), 
    [string]$appServer=$(Get-DefaultParam "appServer")
)

Создайте параметр, который загружает скрипт и предотвращает передачу значения в этот параметр. Это загрузит скрипт в правильной области, если я загружу его в ValidateScript, он не в правильной области. Затем остальные параметры имеют доступ к функциям в Utils.ps1. Это, вероятно, не поддерживаемый побочный эффект, иначе, как если бы я переместил loadScript ниже, другие параметры потерпели неудачу, так как скрипт не был загружен.

  1. Параметры гарантии PowerShell всегда будут загружаться последовательно?
  2. Вместо этого мы должны поместить все функции в Utils.ps1 в глобальную область? для этого потребуется запустить Utils.ps1 перед другими сценариями - что кажется нормальным в сценариях, но не идеально, если сценарии выполняются вручную
  3. Есть ли более поддерживаемый способ сделать это, кроме модулей и #require?
  4. Лучше не использовать значение параметров по умолчанию, а просто кодировать все проверки после получения и проверять $ args, если нам нужно запустить функцию?

1 Ответ

3 голосов
/ 08 января 2020

Вместо этого было бы полезно превратить этот скрипт в Модуль PowerShell , несмотря на ваше заявление о том, что вы хотите его избежать. Таким образом, ваши функции всегда доступны для использования, пока установлен модуль. Кроме того, несмотря на то, что вы не хотите его использовать, директива #Require означает , как вы накладываете ограничения на выполнение вашего скрипта, такие как версия PowerShell или модули, которые должны быть установлены для работы скрипта.


Если вы действительно не хотите помещать это в модуль, вы можете указать точечный источник utils.ps1 от исполняющего пользователя $profile. Пока вы не запускаете powershell.exe с параметром -NoProfile, профиль загружается с каждым сеансом, и ваши функции будут доступны для использования.

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