В 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

592   7  

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" MyA1Func

Availalbe начиная с 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

    Ничего не найдено.