У меня есть файл .ps1, в котором я хочу определить пользовательские функции.
Представьте, что файл называется MyFunctions.ps1, а его содержимое выглядит следующим образом:
Write-Host "Installing functions"
function A1
{
Write-Host "A1 is running!"
}
Write-Host "Done"
Чтобы запустить этот скрипт и теоретически зарегистрировать функцию A1, я перехожу к папке, в которой находится файл .ps1, и запускаю файл:
.\MyFunctions.ps1
Это выводит:
Installing functions
Done
Тем не менее, когда я пытаюсь вызвать A1, я просто получаю сообщение об ошибке, в котором говорится, что нет команды / функции с таким именем:
The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ A1 <<<<
+ CategoryInfo : ObjectNotFound: (A1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Я должен неправильно понять некоторые концепции PowerShell. Могу ли я не определять функции в файлах скриптов?
Обратите внимание, что я уже установил мою политику выполнения на «RemoteSigned». И я знаю, что запускать файлы .ps1, используя точку перед именем файла:. \ MyFile.ps1
powershell
Виллем
источник
источник
Ответы:
Попробуйте это в командной строке PowerShell:
Оператор точки используется для включения скрипта.
источник
. "$PSScriptRoot\MyFunctions.ps1"
. Доступно начиная с версии 3, до этого смотрите stackoverflow.com/questions/3667238/… . Это ОЧЕНЬ распространено.То, о чем вы говорите, называется точечным сорсингом . И это зло. Но не беспокойтесь, есть лучший и простой способ сделать то, что вы хотите с модулями (это звучит гораздо страшнее, чем есть). Основным преимуществом использования модулей является то, что вы можете выгружать их из оболочки, если вам это необходимо, и это предотвращает проникновение переменных в функции в оболочку (как только вы укажете источник файла функции, попробуйте вызвать одну из переменных из функция в оболочке, и вы поймете, что я имею в виду).
Итак, сначала переименуйте файл .ps1, в котором есть все ваши функции, в MyFunctions.psm1 (вы только что создали модуль!). Теперь для правильной загрузки модуля вы должны сделать с файлом определенные вещи. Сначала, чтобы Import-Module увидел модуль (вы используете этот командлет для загрузки модуля в оболочку), он должен находиться в определенном месте. Путь к папке модулей по умолчанию: $ home \ Documents \ WindowsPowerShell \ Modules.
В этой папке создайте папку с именем MyFunctions и поместите в нее файл MyFunctions.psm1 (файл модуля должен находиться в папке с тем же именем, что и файл PSM1).
Как только это будет сделано, откройте PowerShell и выполните следующую команду:
Если вы видите один с именем MyFunctions, вы сделали это правильно, и ваш модуль готов к загрузке (это просто для того, чтобы убедиться, что все настроено правильно, вам нужно сделать это только один раз).
Чтобы использовать модуль, введите в оболочке следующее (или поместите эту строку в свой профиль $, или поместите в качестве первой строки в скрипте):
Теперь вы можете запускать свои функции. Круто то, что когда у вас будет 10-15 функций, вы забудете имя пары. Если они есть в модуле, вы можете запустить следующую команду, чтобы получить список всех функций вашего модуля:
Это довольно мило, и крошечное усилие, которое требуется для установки на лицевой стороне, ОЧЕНЬ стоит.
источник
Import-Module .\buildsystem\PSUtils.psm1
.
withImport-Module
и переименовать расширение, и не требует, чтобы модули были помещены в определенную папку, то есть я могу иметь его в любом каталоге, который я хочу, так же как с точечным источником, есть ли причина даже делать точечный поиск по модулям, учитывая преимущества, которые приходят для определения объема? (если, конечно, вам не нужны эти "проблемы"). "$PSScriptRoot\MyFunctions.ps1" MyA1Func
Начиная с версии 3, можно ознакомиться с разделом Как узнать местоположение файловой системы сценария PowerShell? , Это ОЧЕНЬ распространено.
PS Я не подписываюсь под правилом «все является модулем». Мои сценарии используются другими разработчиками вне GIT, поэтому я не люблю помещать вещи в определенное место или изменять системные переменные среды до запуска моего сценария. Это всего лишь сценарий (или два, или три).
источник
Get-Command -Module FluentMigrator.PowerShell
это довольно приятно?Вы, безусловно, можете определять функции в файлах скриптов (я загружаю их через мой профиль Powershell при загрузке).
Сначала вам нужно проверить, что функция загружена, запустив:
И убедитесь, что он появляется в списке (должен быть список из 1!), А затем дайте нам знать, что вы получите!
источник
Вы можете добавить функцию к:
Функция будет доступна.
источник
Если в вашем файле есть только одна основная функция, которую вы хотите вызвать / открыть, тогда вы также можете просто запустить файл с:
Затем вы можете назвать это, например, следующим образом:
Это делает его намного более удобным, если вы хотите легко вызывать только эту функцию, не импортируя ее.
источник
[CmdletBinding()]
атрибут и обновляет его бесплатно до расширенной функции. :-)Предполагая, что у вас есть файл модуля с именем Dummy-Name.psm1, который имеет метод с именем Function-Dumb ()
источник