Как мне расставить точки над исходными функциями во вложенной папке в PowerShell

#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. Идеальный. Большое вам спасибо.