#windows #powershell #dot-source
#Windows #powershell #точка-исходный код
Вопрос:
Я пытаюсь создать модуль PowerShell, который будет расставлять точки над любыми функциями, найденными в вложенной папке » Functions», используя следующий код:
# Get the path to the function files
$functionPath = $PSScriptRoot "Functions"
# Get a list of all the function filenames
$functionList = Get-ChildItem -Path $functionPath -Include *.ps1 -Name
# Loop through all discovered files and dot-source them into memory
ForEach ( $function in $functionList ) {
. ( $functionPath $function )
}
Это работает нормально, если я удаляю все свои функции непосредственно в папке » Functions». Однако это не идеально, поскольку я не думаю, что это позволяет надлежащим образом управлять файлами функций в более позднее время (особенно в командной среде, где несколько системных администраторов могут изменять файл сценария каждой функции в любой момент времени). Кроме того, некоторые функции принимают входные данные из CSV или текстовых файлов, и будет намного удобнее, если эти ресурсы и соответствующая функция будут содержаться в одной папке.
Отсюда мой вопрос: Как мне выполнить то, что я пытаюсь сделать выше (т. Е. расставить ВСЕ функции, которые находятся в подпапке » Functions» $ PSScriptRoot, даже если они расположены во вложенных папках?)?
PS. Конечная цель — создать модуль общего назначения, который я распространяю на всех своих рабочих станциях администратора, который сделает доступными все созданные нами сценарии / функции, связанные с администрированием. Затем, когда мы добавляем и удаляем скрипты, они динамически обновляются в модуле при каждом запуске PowerShell.
Спасибо Брайану Кафферки в этом видео на YouTube за вдохновение
Комментарии:
1. Зачем вам нужен точечный источник? если вы хотите, чтобы все эти функции были доступны в любом случае, почему бы просто не добавить их в модуль верхнего уровня или в их собственные модули и (при условии, что они «установлены» правильно) они будут автоматически доступны пользователям в PowerShell?
2. Потому что я не хочу управлять несколькими модулями. Кроме того, если я помещу все функции в один модуль, я увеличу риск возможного повреждения файла или создам проблемы в будущем, если кто-то проверит файл и допустит ошибку — весь модуль сломается. Таким образом, я изолирую каждую функцию и управление ею.
Ответ №1:
Вы можете немного упростить это с помощью однострочного:
Get-ChildItem -Path "$PSScriptRootFunctions" -Filter *.ps1 -Recurse | %{. $_.FullName }
Вам не хватало -Recurse
параметра и вы могли бы использовать $function.FullName
вместо объединения $functionPath
и $function
Комментарии:
1. Потрясающе! Спасибо, это сработало как по волшебству. Очень ценится Rich.
2. Идеальный. Большое вам спасибо.