В PowerShell как определить функцию в файле и вызвать ее из командной строки PowerShell?
у меня есть файл.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
7 ответов:
попробуйте это в командной строке PowerShell:
. .\MyFunctions.ps1 A1оператор точки используется для включения скрипта.
о чем вы говорите называется точка. И это зло. Но не беспокойтесь, есть лучший и более простой способ сделать то, что вы хотите с модули (это звучит намного страшнее, чем есть). Основное преимущество использования модулей заключается в том, что вы можете выгрузить их из оболочки, если вам нужно, и это удерживает переменные в функциях от проникновения в оболочку (после того, как вы разместите исходный файл функции, попробуйте вызвать одну из переменных из A функция в оболочке, и вы увидите, что я имею в виду).
Итак, сначала переименуйте файл. ps1, в котором есть все ваши функции, в MyFunctions.psm1 (вы только что создали модуль!). Теперь для правильной загрузки модуля вам нужно сделать некоторые конкретные вещи с файлом. Во-первых, чтобы Import-Module увидел модуль (вы используете этот командлет для загрузки модуля в оболочку), он должен быть в определенном месте. Путь к папке модулей по умолчанию: $home\Documents\WindowsPowerShell\Modules.
в этой папке создайте папку с именем MyFunctions и поместите MyFunctions.файл psm1 в него (файл модуля должен находиться в папке с точно таким же именем, что и файл PSM1).
как только это будет сделано, откройте PowerShell и выполните следующую команду:
Get-Module -listavailableЕсли вы видите один называется MyFunctions, вы сделали это правильно, и ваш модуль готов к загрузке (это только для того, чтобы убедиться, что это настроено правильно, вы только нужно сделать это один раз).
чтобы использовать модуль, введите следующее в оболочке (или поместите эту строку в свой профиль$, или поместите это как первую строку в скрипт):
Import-Module MyFunctionsТеперь вы можете выполнить свои функции. Самое классное в этом то, что как только у вас будет 10-15 функций, вы забудете имя пары. Если они есть в модуле, вы можете запустить следующую команду, чтобы получить список всех функций в вашем модуле:
Get-Command -module MyFunctionsЭто довольно мило, и крошечное усилие, которое требуется для установки на передней стороне, стоит того.
. "$PSScriptRoot\MyFunctions.ps1" MyA1FuncAvailalbe начиная с v3, перед этим см. как я могу получить расположение файловой системы сценария PowerShell?. Это очень распространено.
P. S. Я не подписываюсь на все правила модуль'. Мои скрипты используются другими разработчиками из GIT, поэтому мне не нравится помещать вещи в определенное место или изменять системные переменные среды до запуска моего скрипта. Это просто сценарий (или два, или три).
вы, конечно, можете определить функции в файлах скриптов (затем я, как правило, загружаю их через свой профиль Powershell при загрузке).
сначала вы должны проверить, чтобы убедиться, что функция загружается работает:
ls function:\ | where { $_.Name -eq "A1" }и проверьте, что он появляется в списке (должен быть список 1!), то дайте нам знать, что выход вы получаете!
вы можете добавить функцию:
c:\Users\David\Documents\WindowsPowerShell\profile.ps1функция будет доступна.
Если ваш файл имеет только одну основную функцию, которую вы хотите позвонить/разоблачить, то вы также можете просто запустить файл с:
Param($Param1)затем вы можете вызвать его, например, следующим образом:
.\MyFunctions.ps1 -Param1 'value1'это делает его гораздо более удобным, если вы хотите легко вызвать только эту функцию без необходимости импортировать функцию.
предполагая, что у вас есть файл модуля с именем Dummy-Name.psm1, который имеет метод, называемый Function-Dumb ()
Import-Module "Dummy-Name.psm1"; Get-Command -Module "Function-Dumb"; # # Function-Dumb;
Comments