Mam plik .ps1, w którym chcę zdefiniować niestandardowe funkcje.
Wyobraź sobie, że plik nazywa się MyFunctions.ps1, a zawartość jest następująca:
Write-Host "Installing functions"
function A1
{
Write-Host "A1 is running!"
}
Write-Host "Done"
Aby uruchomić ten skrypt i teoretycznie zarejestrować funkcję A1, przejdź do folderu, w którym znajduje się plik .ps1, i uruchom plik:
.\MyFunctions.ps1
To daje:
Installing functions
Done
Jednak gdy próbuję wywołać A1, po prostu pojawia się błąd stwierdzający, że nie ma polecenia / funkcji o tej nazwie:
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
Muszę źle zrozumieć niektóre koncepcje PowerShell. Czy nie mogę zdefiniować funkcji w plikach skryptów?
Zauważ, że ustawiłem już moją zasadę wykonania na „RemoteSigned”. Wiem, że mogę uruchamiać pliki .ps1 za pomocą kropki przed nazwą pliku:. \ MyFile.ps1
powershell
willem
źródło
źródło
Odpowiedzi:
Wypróbuj to w wierszu poleceń PowerShell:
Operator kropki służy do włączenia skryptu.
źródło
. "$PSScriptRoot\MyFunctions.ps1"
. Availalbe począwszy v3, przed tym zobaczyć stackoverflow.com/questions/3667238/... . To jest BARDZO powszechne.To, o czym mówisz, nazywa się pozyskiwaniem kropek . I to jest złe. Ale nie martw się, istnieje lepszy i łatwiejszy sposób na robienie tego, co chcesz z modułami (brzmi to znacznie bardziej przerażająco niż jest). Główną zaletą korzystania z modułów jest to, że możesz je rozładować z powłoki, jeśli to konieczne, i powstrzymuje zmienne w funkcjach przed wkradaniem się do powłoki (po kropkowaniu źródła pliku funkcji spróbuj wywołać jedną ze zmiennych z funkcja w powłoce, a zobaczysz, co mam na myśli).
Najpierw zmień nazwę pliku .ps1, który zawiera wszystkie twoje funkcje, na MyFunctions.psm1 (właśnie utworzyłeś moduł!). Teraz, aby moduł ładował się poprawnie, musisz zrobić pewne określone rzeczy z plikiem. Najpierw moduł importujący widzi moduł (używasz tego polecenia cmdlet, aby załadować moduł do powłoki), musi on znajdować się w określonym miejscu. Domyślna ścieżka do folderu modułów to $ home \ Documents \ WindowsPowerShell \ Modules.
W tym folderze utwórz folder o nazwie MyFunctions i umieść w nim plik MyFunctions.psm1 (plik modułu musi znajdować się w folderze o dokładnie takiej samej nazwie jak plik PSM1).
Po zakończeniu otwórz PowerShell i uruchom następującą komendę:
Jeśli widzisz jeden o nazwie MyFunctions, zrobiłeś to dobrze, a twój moduł jest gotowy do załadowania (to po prostu, aby upewnić się, że jest poprawnie skonfigurowany, musisz to zrobić tylko raz).
Aby użyć modułu, wpisz następujące polecenie w powłoce (lub umieść ten wiersz w swoim profilu $ lub umieść to jako pierwszy wiersz w skrypcie):
Możesz teraz uruchomić swoje funkcje. Fajną rzeczą jest to, że gdy masz już 10-15 funkcji, zapomnisz nazwy pary. Jeśli masz je w module, możesz uruchomić następującą komendę, aby uzyskać listę wszystkich funkcji w module:
Jest całkiem słodki, a niewielki wysiłek, jaki trzeba ustawić z przodu, jest WARTO.
źródło
Import-Module .\buildsystem\PSUtils.psm1
.
sięImport-Module
i zmiany nazwy rozszerzenia, i nie wymaga moduły mają być umieszczone w folderze konkretnym, czyli mogę mieć go w dowolnym katalogu chcę, podobnie jak w przypadku dot sourcing, jest czy jest jakiś powód, aby nawet pozyskiwać kropki w modułach, biorąc pod uwagę korzyści płynące z określania zakresu? (chyba że oczywiście te „zakresy” zakresu są tym, czego chcesz). "$PSScriptRoot\MyFunctions.ps1" MyA1Func
Dostępne od wersji v3, wcześniej zobacz Jak mogę uzyskać lokalizację systemu plików skryptu PowerShell? . To jest BARDZO powszechne.
PS Nie zgadzam się z zasadą „wszystko jest modułem”. Moje skrypty są używane przez innych programistów poza GIT, więc nie lubię umieszczać rzeczy w określonym miejscu ani modyfikować zmiennych środowiskowych systemu przed uruchomieniem skryptu. To tylko skrypt (dwa lub trzy).
źródło
Get-Command -Module FluentMigrator.PowerShell
jest całkiem niezły?Z pewnością możesz zdefiniować funkcje w plikach skryptów (następnie ładuję je przez mój profil Powershell).
Najpierw sprawdź, czy funkcja jest ładowana, uruchamiając:
I sprawdź, czy pojawia się na liście (powinna to być lista 1!), A następnie daj nam znać, jaki wynik otrzymasz!
źródło
Możesz dodać funkcję do:
Funkcja będzie dostępna.
źródło
Jeśli plik ma tylko jedną główną funkcję, którą chcesz wywołać / ujawnić, możesz również uruchomić plik za pomocą:
Możesz to nazwać np. W następujący sposób:
To sprawia, że jest znacznie wygodniej, jeśli chcesz łatwo wywołać tylko tę funkcję bez konieczności importowania funkcji.
źródło
[CmdletBinding()]
atrybut i aktualizuje go za darmo do zaawansowanej funkcji. :-)Zakładając, że masz plik modułu o nazwie Dummy-Name.psm1, który zawiera metodę o nazwie Function-Dumb ()
źródło