Вначале я скажу, что я все еще довольно сильная ладья 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 ниже, другие параметры потерпели неудачу, так как скрипт не был загружен.
- Параметры гарантии PowerShell всегда будут загружаться последовательно?
- Вместо этого мы должны поместить все функции в Utils.ps1 в глобальную область? для этого потребуется запустить Utils.ps1 перед другими сценариями - что кажется нормальным в сценариях, но не идеально, если сценарии выполняются вручную
- Есть ли более поддерживаемый способ сделать это, кроме модулей и #require?
- Лучше не использовать значение параметров по умолчанию, а просто кодировать все проверки после получения и проверять $ args, если нам нужно запустить функцию?