Mam skrypt PowerShell, który wykonuje pewne czynności przy użyciu bieżącego katalogu skryptu. Więc w tym katalogu, bieganie .\script.ps1
działa poprawnie.
Teraz chcę wywołać ten skrypt z innego katalogu bez zmiany katalogu, do którego się odwołuje skrypt. Więc chcę wywołać ..\..\dir\script.ps1
i nadal chcę, aby skrypt zachowywał się tak, jak został wywołany z wnętrza swojego katalogu.
Jak to zrobić lub jak zmodyfikować skrypt, aby można go było uruchomić z dowolnego katalogu?
źródło
ant
z pewnymi parametrami. Muszę więc zadzwonićant
z tego folderu, aby upewnić się, że poprawnie odnajdzie plik konfiguracyjny. Idealnie szukam czegoś do tymczasowej zmiany katalogu wykonywania lokalnie w tym skrypcie.Push-Location
iPop-Location
Jeśli dzwonisz do aplikacji natywnych, musisz się martwić, że
[Environment]::CurrentDirectory
nie chodzi o$PWD
bieżący katalog programu PowerShell . Z różnych powodów program PowerShell nie ustawia bieżącego katalogu roboczego procesu podczas ustawiania lokalizacji lub lokalizacji wypychania, więc musisz się upewnić, że robisz to, jeśli używasz aplikacji (lub poleceń cmdlet), które oczekują, że zostanie ustawiony.W skrypcie możesz to zrobić:
Nie ma niezawodnej alternatywy. Wielu z nas umieściło linię w naszej funkcji zachęty, aby ustawić [Środowisko] :: CurrentDirectory ... ale to nie pomaga, gdy zmieniasz lokalizację w skrypcie.
Dwie uwagi dotyczące powodu, dla którego nie jest to ustawiane automatycznie przez program PowerShell:
$PWD
katalog roboczy, ale jest tylko jeden proces i tylko jedno środowisko.$PWD
nie zawsze jest to legalny katalog CurrentDirectory (możesz na przykład CD do dostawcy rejestru).Jeśli chcesz umieścić go w swoim znaku zachęty (który działałby tylko w głównym obszarze działania, jednowątkowy), musisz użyć:
źródło
.\_/.
- bo to zabiło połowę mojego dnia! Ludzie, poważnie? Poważnie? ..[Environment]::CurrentDirectory
jeśli różni się on od$PWD
. Prawidłową rzeczą byłoby zapisanie go w zmiennej,$origEnvDir = [Environment]::CurrentDirectory
a następnie przywrócenie go później[Environment]::CurrentDirectory = $origEnvDir
.Są odpowiedzi z dużą liczbą głosów, ale kiedy przeczytałem twoje pytanie, pomyślałem, że chcesz poznać katalog, w którym znajduje się skrypt, a nie ten, w którym skrypt jest uruchomiony. Możesz uzyskać informacje za pomocą zmiennych automatycznych PowerShell
Na przykład mam skrypt $ profile, który znajduje plik rozwiązania Visual Studio i uruchamia go. Chciałem zapisać pełną ścieżkę po uruchomieniu pliku rozwiązania. Ale chciałem zapisać plik, w którym istnieje oryginalny skrypt. Więc użyłem $ PsScriptRoot.
źródło
Często używałem poniższego kodu do importowania modułu, który znajduje się w tym samym katalogu, co uruchomiony skrypt. Najpierw pobierze katalog, z którego działa PowerShell
źródło
To by działało dobrze.
źródło
Pop-Location
na końcu, aby przywrócić ścieżkę do jej pierwotnego stanu.Cóż, szukałem przez jakiś czas rozwiązania tego problemu, bez żadnych skryptów tylko z CLI. Tak to robię xD:
Przejdź do folderu, z którego chcesz uruchomić skrypt (ważne jest to, że masz wypełnienia kart)
..\..\dir
Teraz otocz lokalizację podwójnymi cudzysłowami, a wewnątrz nich dodaj
cd
, abyśmy mogli wywołać kolejną instancję programu PowerShell."cd ..\..\dir"
Dodaj kolejne polecenie, aby uruchomić skrypt oddzielony
;
znakiem, za pomocą jest separatorem poleceń w programie PowerShell"cd ..\..\dir\; script.ps1"
Wreszcie uruchom go z inną instancją programu PowerShell
start powershell "cd..\..\dir\; script.ps1"
Spowoduje to otwarcie nowego okna programu PowerShell, przejście do
..\..\dir
, uruchomieniescript.ps1
i zamknięcie okna.Zwróć uwagę, że ";" po prostu oddziela polecenia, tak jak wpisałeś je jedno po drugim, jeśli pierwsza zawiedzie, druga uruchomi się i następna po, a następnie po ... Jeśli chcesz pozostawić otwarte nowe okno PowerShell, dodaj -noexit w przekazanym poleceniu. Zauważ, że najpierw przechodzę do żądanego folderu, aby móc użyć uzupełniania tabulatorów (nie możesz w cudzysłowach).
start powershell "-noexit cd..\..\dir\; script.ps1"
Użyj podwójnych cudzysłowów,
""
aby móc przekazywać katalogi ze spacjami w nazwach, np.start powershell "-noexit cd '..\..\my dir'; script.ps1"
źródło
Zrobiłem jedną linijkę z rozwiązania @ JohnL:
źródło