Dowiedziałem się, że ustawienie zmiennej środowiskowej PATH wpływa tylko na stary wiersz polecenia. Wygląda na to, że PowerShell ma inne ustawienia środowiska. Jak zmienić zmienne środowiskowe dla PowerShell (v1)?
Uwaga:
Chcę, aby moje zmiany były trwałe, więc nie muszę ich ustawiać za każdym razem, gdy uruchamiam PowerShell. Czy PowerShell ma plik profilu? Coś jak profil Bash na Uniksie?
windows
powershell
Wasil
źródło
źródło
"
) w zmiennej środowiskowej ścieżki$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
Odpowiedzi:
Zmiana rzeczywistych zmiennych środowiskowych może odbywać się za pomocą
env: namespace / drive
informacji. Na przykład ten kod zaktualizuje zmienną środowiskową ścieżki:Istnieją sposoby na trwałe ustawienie ustawień środowiska, ale jeśli używasz ich tylko z PowerShell, prawdopodobnie lepiej jest użyć swojego profilu do zainicjowania ustawień. Podczas uruchamiania PowerShell uruchomi wszystkie znalezione pliki .ps1 w
WindowsPowerShell
katalogu w folderze Moje dokumenty. Zazwyczaj masz już plik profile.ps1 . Ścieżka na moim komputerze toźródło
C:\path\to\file.ext
do zmiennych środowiskowych? EDYCJA: już to znalazłem. Odpowiedź brzmi: tak, stwórz ją. Plik powinien składać się z 1 linii:$env:path += ;C:\path\to\file.ext"
.$env:Path = "SomeRandomPath";
Zamiast tego - patrz @mloskot poniżej.Jeśli jakiś czas podczas sesji PowerShell musisz tymczasowo dołączyć do zmiennej środowiskowej PATH, możesz to zrobić w ten sposób:
źródło
$env:Path = "C:\MyPath;$env:Path"
Można również trwale modyfikować zmienne środowiskowe użytkownika / systemu (tj. Będą trwałe podczas restartów powłoki), wykonując następujące czynności:
Zmodyfikuj systemową zmienną środowiskową
Zmodyfikuj zmienną środowiskową użytkownika
Użycie z komentarzy - dodaj do systemowej zmiennej środowiskowej
Rozwiązanie oparte na łańcuchach jest również możliwe, jeśli nie chcesz pisać typów
źródło
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine)
Nie zobaczysz wyniku tej zmiany, dopóki nie rozpoczniesz nowej sesji programu PowerShell. Oznacza to, że jeśli przejrzysz $ env: Path natychmiast po uruchomieniu tego polecenia, zobaczysz, co $ env: Path było przed poleceniem. Aby zaktualizować, zamknij i otwórz powłokę lub rozpocznij nową sesję.[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Z wiersza polecenia programu PowerShell:
Powinieneś zobaczyć tekst:
Uruchom ponownie sesję, a zmienna będzie dostępna.
setx
może być również użyty do ustawienia dowolnych zmiennych. Wpiszsetx /?
monit w celu uzyskania dokumentacji.Przed zadziałaniem ze swoją ścieżką w ten sposób upewnij się, że zapisałeś kopię swojej istniejącej ścieżki, wykonując
$env:path >> a.out
polecenie programu PowerShell.źródło
$env:PATH
najpierw, a następniesetx /m PATH "$env:PATH"
zastosować lokalnie i globalnie bez restartu powłoki?Podobnie jak odpowiedź JeanT , chciałem abstrakcji wokół dodawania do ścieżki. W przeciwieństwie do odpowiedzi JeanT potrzebowałem, aby działała bez interakcji użytkownika. Inne zachowanie, którego szukałem:
$env:Path
aby zmiana obowiązywała w bieżącej sesjiJeśli jest to przydatne, oto:
Sprawdź moją treść dla odpowiedniej
Remove-EnvPath
funkcji.źródło
Chociaż bieżąca zaakceptowana odpowiedź działa w tym sensie, że zmienna ścieżki jest stale aktualizowana w kontekście programu PowerShell, w rzeczywistości nie aktualizuje zmiennej środowiskowej przechowywanej w rejestrze systemu Windows.
Aby to osiągnąć, możesz oczywiście również użyć programu PowerShell:
Więcej informacji znajduje się w poście na blogu Użyj programu PowerShell, aby zmodyfikować ścieżkę środowiska
Jeśli korzystasz z rozszerzeń społeczności PowerShell, poprawnym poleceniem dodania ścieżki do ścieżki zmiennej środowiskowej jest:
źródło
Wszystkie odpowiedzi sugerujące trwałą zmianę mają ten sam problem: psują wartość rejestru ścieżki.
SetEnvironmentVariable
zamieniaREG_EXPAND_SZ
wartość%SystemRoot%\system32
naREG_SZ
wartośćC:\Windows\system32
.Wszelkie inne zmienne na ścieżce również zostaną utracone. Dodanie nowych przy użyciu
%myNewPath%
już nie będzie działać.Oto skrypt
Set-PathVariable.ps1
, którego używam do rozwiązania tego problemu:Wyjaśniam problem bardziej szczegółowo w poście na blogu .
źródło
To ustawia ścieżkę dla bieżącej sesji i zachęca użytkownika do jej dodania na stałe:
Możesz dodać tę funkcję do domyślnego profilu (
Microsoft.PowerShell_profile.ps1
), zwykle znajdującego się pod adresem%USERPROFILE%\Documents\WindowsPowerShell
.źródło
Opierając się na odpowiedzi @Michaela Kropat'a, dodałem parametr, aby dodać nową ścieżkę do istniejącej
PATH
zmiennej i sprawdzić, aby uniknąć dodania nieistniejącej ścieżki:źródło
Jak wspomniano tutaj Jonathan Leaders , ważne jest, aby uruchomić komendę / skrypt podniesiony, aby móc zmieniać zmienne środowiskowe dla „komputera” , ale uruchomienie niektórych podniesionych poleceń nie musi być wykonywane z rozszerzeniami społeczności, więc chciałbym aby zmodyfikować i rozszerzyć odpowiedź JeanT w taki sposób, że zmiana zmiennych maszynowych może być również wykonana, nawet jeśli sam skrypt nie jest uruchamiany z podwyższonym poziomem uprawnień:
źródło
Większość odpowiedzi nie dotyczy UAC . Obejmuje to problemy z UAC.
Najpierw zainstaluj rozszerzenia społeczności PowerShell:
choco install pscx
przez http://chocolatey.org/ (może być konieczne zrestartowanie środowiska powłoki).Następnie włącz pscx
Następnie użyj
Invoke-Elevated
źródło
Moja propozycja jest następująca:
Przetestowałem to, aby dodać
C:\oracle\x64\bin
do zmiennej środowiskowej naPath
stałe i działa dobrze.Pierwszy sposób to po prostu zrobić:
Ale ta zmiana nie jest trwała.
$env:path
wróci do poprzedniego stanu, jak tylko zamkniesz terminal PowerShell i ponownie go otworzysz. Jest tak, ponieważ zastosowałeś zmianę na poziomie sesji, a nie na poziomie źródła (którym jest poziom rejestru). Aby wyświetlić globalną wartość$env:path
, wykonaj:Lub dokładniej:
Teraz, aby to zmienić, najpierw przechwytujemy oryginalną ścieżkę, którą należy zmodyfikować:
Teraz określamy, jak powinna wyglądać nowa ścieżka. W tym przypadku dodajemy nowy folder:
Uwaga: Upewnij się, że
$newpath
wygląda tak, jak chcesz. Jeśli nie, możesz uszkodzić swój system operacyjny.Teraz zastosuj nową wartość:
Teraz wykonaj ostatnią kontrolę, czy wygląda to tak, jak się spodziewasz:
Możesz teraz ponownie uruchomić terminal PowerShell (lub nawet zrestartować komputer) i zobaczyć, że nie przywróci on poprzedniej wartości.
Pamiętaj, że kolejność ścieżek może się zmienić, tak aby była w kolejności alfabetycznej, więc upewnij się, że sprawdziłeś całą linię. Aby to ułatwić, możesz podzielić dane wyjściowe na wiersze, używając średnika jako separatora:
źródło
Otwórz PowerShell i uruchom:
źródło
W programie PowerShell można przejść do katalogu zmiennych środowiskowych, wpisując:
Spowoduje to przejście do katalogu Env:>. Z tego katalogu:
Aby zobaczyć wszystkie zmienne środowiskowe, wpisz:
Aby zobaczyć określoną zmienną środowiskową, wpisz:
Aby ustawić zmienną środowiskową, wpisz:
Aby usunąć zmienną środowiskową, wpisz:
Więcej informacji znajduje się w temacie Zmienne środowiskowe .
źródło
Próbowałem trochę zoptymalizować kod SBF i Michaela, aby był bardziej kompaktowy.
Opieram się na przymusie typów programu PowerShell, w którym automatycznie konwertuje ciągi znaków na wartości wyliczane, więc nie zdefiniowałem słownika wyszukiwania.
Wyciągnąłem również blok, który dodaje nową ścieżkę do listy na podstawie warunku, dzięki czemu praca jest wykonywana raz i przechowywana w zmiennej do ponownego użycia.
Następnie jest stosowany na stałe lub tylko do sesji, w zależności od
$PathContainer
parametru.Możemy umieścić blok kodu w funkcji lub pliku ps1, który wywołujemy bezpośrednio z wiersza poleceń. Poszedłem z DevEnvAddPath.ps1.
Robię coś podobnego dla DevEnvRemovePath.ps1.
Jak dotąd wydają się działać.
źródło
Tylko odpowiedzi, które przekazują wartość do rejestru, wpływają na trwałą zmianę (więc większość odpowiedzi w tym wątku, w tym odpowiedź zaakceptowana, nie ma trwałego wpływu na
Path
).Poniższa funkcja działa dla obu
Path
/PSModulePath
iUser
/System
typów. Domyślnie doda także nową ścieżkę do bieżącej sesji.źródło