Chcę wykonać wywołanie skryptu myScript1.ps1 wewnątrz drugiego skryptu myScript2.ps1 wewnątrz Powershell ISE.
Poniższy kod w MyScript2.ps1, działa dobrze z Powershell Administration, ale nie działa w PowerShell ISE:
#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
Otrzymuję następujący błąd, gdy wykonuję MyScript2.ps1 z PowerShell ISE:
Wyrażenie „. \ MyScript1.ps1” nie jest rozpoznawane jako nazwa polecenia cmdlet, funkcji, pliku skryptu lub programu operacyjnego. Sprawdź pisownię nazwy lub, jeśli ścieżka została dołączona, sprawdź, czy jest ona poprawna i spróbuj ponownie.
źródło
Bieżąca ścieżka MyScript1.ps1 różni się od myScript2.ps1. Możesz uzyskać ścieżkę do folderu MyScript2.ps1 i połączyć ją z MyScript1.ps1, a następnie wykonać. Oba skrypty muszą znajdować się w tej samej lokalizacji.
źródło
Wywołuję myScript1.ps1 z myScript2.ps1.
Zakładając, że oba skrypty znajdują się w tej samej lokalizacji, najpierw pobierz lokalizację skryptu za pomocą tego polecenia:
Następnie dodaj nazwę skryptu, który chcesz wywołać w następujący sposób:
To powinno działać.
źródło
& "$PSScriptRoot\myScript1.ps1"
wystarczyRozwiązanie jednoprzewodowe:
źródło
& '.\MyScript1.ps'
jeśli skrypt znajduje się w tym samym katalogu?To jest tylko dodatkowa informacja do odpowiedzi, aby przekazać argument do innego pliku
Gdzie spodziewasz się kłótni
PrintName.ps1
Jak wywołać plik
Jeśli nie podasz żadnych danych wejściowych, domyślnie będzie to "Joe" i zostanie to przekazane jako argument do argumentu printName w pliku PrintName.ps1 , który z kolei wydrukuje napis "Joe"
źródło
Być może już znalazłeś na to odpowiedź, ale oto co robię.
Zwykle umieszczam tę linię na początku moich skryptów instalacyjnych:
Następnie mogę użyć zmiennej $ PSScriptRoot jako lokalizacji bieżącego skryptu (ścieżki), jak w przykładzie poniżej:
W twoim przypadku możesz wymienić
Rozpocznij proces ... zgodnie z
Invoke-Expression $ PSScriptRoot \ ScriptName.ps1
Więcej informacji na temat automatycznych zmiennych $ MYINVOCATION i $ PSScriptRoot można znaleźć w witrynie Microsoft: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables
źródło
Aby łatwo wykonać plik skryptu w tym samym folderze (lub podfolderze) co dzwoniący, możesz użyć tego:
źródło
Miałem z tym problem. Nie użyłem jednak żadnych sprytnych
$MyInvocation
rzeczy, aby to naprawić. Jeśli otworzysz ISE, klikając prawym przyciskiem myszy plik skryptu i wybierając,edit
a następnie otwórz drugi skrypt z poziomu ISE, możesz wywołać jeden z drugiego, używając zwykłej składni. \ Script.ps1 . Domyślam się, że ISE ma pojęcie bieżącego folderu i otwarcie go w ten sposób ustawia bieżący folder na folder zawierający skrypty. Kiedy wywołuję jeden skrypt z innego w normalnym użyciu, po prostu używam . \ Script.ps1 , IMO, błędem jest modyfikowanie skryptu tylko po to, aby działał poprawnie w ISE ...źródło
Miałem podobny problem i rozwiązałem go w ten sposób.
Mój katalog roboczy to ogólny folder skryptów i konkretny folder skryptów na serwerze w tym samym katalogu głównym. Muszę wywołać określony folder skryptów (który wywołuje ogólny skrypt z parametrem konkretnego problemu). Więc katalog roboczy wygląda tak
Solutions1 i Solutions2 wywołują PS1 w folderze Scripts ładując parametr przechowywany w ParameterForSolution. Więc w PowerShell ISE uruchamiam to polecenie
A kod wewnątrz Solution1.PS1 to:
źródło
Podaję swój przykład do rozważenia. W ten sposób nazywam kod ze skryptu kontrolera w narzędziach, które tworzę. Skrypty, które wykonują tę pracę, również muszą akceptować parametry, więc ten przykład pokazuje, jak je przekazać. Zakłada, że wywoływany skrypt znajduje się w tym samym katalogu co skrypt kontrolera (skrypt wykonujący wywołanie).
Powyższy skrypt to kontroler, który akceptuje 3 parametry. Są one zdefiniowane w bloku parametrów. Następnie skrypt kontrolera wywołuje skrypt o nazwie Get-ZAEventLogData.ps1. Na przykład ten skrypt akceptuje również te same 3 parametry. Kiedy skrypt kontrolera wywołuje skrypt, który wykonuje pracę, musi go wywołać i przekazać parametry. Powyższe pokazuje, jak robię to przez splatting.
źródło
Jak uruchamiać wbudowane skrypty PowerShell w swoich skryptach?
Jak korzystać z wbudowanych skryptów, takich jak
Są one uruchamiane przez Twój komputer, automatycznie sprawdzając ścieżkę do skryptu.
Podobnie mogę uruchamiać własne skrypty, po prostu umieszczając nazwę skryptu w bloku skryptu
Przejdź do wiersza poleceń PowerShell i wpisz
Spowoduje to zwrócenie ścieżki do pliku, który nasz wiersz poleceń programu PowerShell wykona za każdym razem, gdy otworzysz aplikację.
Będzie to wyglądało tak
Przejdź do Dokumentów i sprawdź, czy masz już katalog WindowsPowerShell. Tak nie zrobiłem
Stworzyliśmy teraz skrypt, który będzie uruchamiany za każdym razem, gdy otworzymy aplikację PowerShell.
Powodem tego było to, że mogliśmy dodać własny folder zawierający wszystkie nasze niestandardowe skrypty. Utwórzmy ten folder i nadam mu nazwę „Bin” po katalogach, w których Mac / Linux przechowuje swoje skrypty.
Teraz chcemy, aby ten katalog był dodawany do naszej
$env:path
zmiennej za każdym razem, gdy otwieramy aplikację, więc wróć doWindowsPowerShell
katalogu iNastępnie dodaj to
Teraz powłoka automatycznie znajdzie twoje polecenia, o ile zapiszesz skrypty w tym katalogu „Bin”.
Uruchom ponownie PowerShell i powinien to być jeden z pierwszych wykonywanych skryptów.
Uruchom to w wierszu poleceń po ponownym załadowaniu, aby zobaczyć nowy katalog w zmiennej ścieżki:
Teraz możemy wywoływać nasze skrypty z wiersza poleceń lub z poziomu innego skryptu w taki prosty sposób:
Jak widzisz, musimy wywoływać je z
.ps1
rozszerzeniem, dopóki nie utworzymy dla nich aliasów. Jeśli chcemy mieć ochotę.źródło