Miałem podobne problemy i sprawiało mi to dużo problemów, ponieważ tworzę programy napisane w PowerShell (aplikacje GUI dla użytkowników końcowych) i mam dużo plików i zasobów, które muszę załadować z dysku. Z mojego doświadczenia .
wynika , że używanie do reprezentowania bieżącego katalogu jest zawodne. Powinien reprezentować bieżący katalog roboczy, ale często nie. Wygląda na to, że PowerShell zapisuje lokalizację, z której wywołano PowerShell .
. Mówiąc ściślej, przy pierwszym uruchomieniu PowerShell, domyślnie uruchamia się w katalogu użytkownika domowego. Zazwyczaj jest to katalog twojego konta użytkownika, coś w rodzajuC:\USERS\YOUR USER NAME
. Następnie PowerShell zmienia katalog na katalog, z którego został wywołany, lub na katalog, w którym znajduje się wykonywany skrypt, przed wyświetleniem monitu programu PowerShell lub uruchomieniem skryptu. Ale dzieje się tak, gdy sama aplikacja PowerShell uruchamia się pierwotnie w katalogu użytkownika domowego.
I .
reprezentuje ten początkowy katalog, w którym uruchomiono PowerShell. .
Reprezentuje więc tylko bieżący katalog na wypadek, gdyby PowerShell został wywołany z poszukiwanego katalogu. Jeśli później zmienisz katalog w kodzie programu PowerShell, zmiana nie pojawi się .
w każdym przypadku. W niektórych przypadkach .
reprezentuje bieżący katalog roboczy, aw innych katalog, z którego wywołano PowerShell (sam, a nie skrypt), co może prowadzić do niespójnych wyników. Z tego powodu używam skryptu wywołującego. Skryptu PowerShell z pojedynczym wewnątrz polecenia:
POWERSHELL
. To zapewni, że PowerShell zostanie wywołany z poszukiwanego katalogu, a tym samym.
reprezentują bieżący katalog. Działa to tylko wtedy, gdy później nie zmienisz katalogu w kodzie programu PowerShell. W przypadku scenariusza, używam skryptu wywołującego, który jest podobny do ostatniego już wspomniałem, oprócz tego, że zawiera opcję pliku:
POWERSHELL -FILE DRIVE:\PATH\SCRIPT NAME.PS1
. Zapewnia to uruchomienie programu PowerShell w bieżącym katalogu roboczym.
Po prostu kliknięcie skryptu wywołuje program PowerShell z katalogu domowego użytkownika bez względu na to, gdzie znajduje się skrypt. Wynika to z tego, że bieżącym katalogiem roboczym jest katalog, w którym znajduje się skrypt, ale katalogiem wywołania programu PowerShell jest C:\USERS\YOUR USER NAME
, a .
zwracanie jednego z tych dwóch katalogów w zależności od sytuacji jest śmieszne.
Jednak aby uniknąć zamieszania i to wszystko za pomocą skryptu wywołującego, można po prostu użyć jednej $PWD
lub $PSSCRIPTROOT
zamiast .
reprezentować bieżącego katalogu w zależności od pogody chcesz reprezentować bieżący katalog lub katalog, z którego scenariusz został wywołany. A jeśli z jakiegoś powodu chcesz odzyskać inny z dwóch .
zwracanych katalogów , możesz użyć $HOME
.
Osobiście mam po prostu skrypt wywołujący w katalogu głównym moich aplikacji, które rozwijam za pomocą programu PowerShell, który wywołuje mój główny skrypt aplikacji i po prostu pamiętam, aby nigdy nie zmieniać bieżącego katalogu roboczego w kodzie źródłowym mojej aplikacji, więc nigdy nie muszę się o to martwić, i mogę używać .
do reprezentowania bieżącego katalogu i do obsługi względnego adresowania plików w moich aplikacjach bez żadnych problemów. Powinno to działać w nowszych wersjach programu PowerShell (nowszych niż wersja 2).