Jak mogę na stałe dołączyć wpis do zmiennej PATH systemu za pomocą wiersza poleceń?

13

Co muszę zrobić:

  • Dodaj folder do %PATH%zmiennej środowiskowej na poziomie SYSTEMU.
  • Ustaw zmianę na stałe.

Jak muszę to zrobić:

  • Za pomocą wiersza polecenia lub innej metody, za pomocą której wszystkie niezbędne polecenia można zapisać w .BATpliku.
  • Używanie tylko narzędzi, które byłyby dostępne w zwykłej instalacji systemu Windows XP z dodatkiem SP3, bez połączenia z Internetem.
  • Wolę uruchomić skrypt lokalnie, ale mam także zdalny dostęp do systemów docelowych. Pamiętaj jednak, że nie mogę zakładać, że w systemach są włączone inne niż domyślne usługi (np. Rejestr zdalny).

Systemy, na których skrypt musi działać:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

Dość dobrze znam to SETpolecenie, ale zdaję sobie również sprawę, że generalnie zastąpi ono istniejącą zmienną zamiast do niej dołączyć. To jest nie do przyjęcia. Czy istnieje inne narzędzie (lub opcja SET, której nie znam), które zamiast tego dołączą się do zmiennej? Czy też muszę umieścić obejście w skrypcie, które obejmuje tymczasowe skopiowanie istniejącej zmiennej do innej zmiennej lub pliku tekstowego?

Rozumiem też, że SETnie zmieni na stałe zmiennej. Widziałem wzmiankę SETX, ale wydaje się, że nie jest ona wbudowana w system Windows XP SP3 (a przynajmniej nie wydaje się być dostępna w systemie, nad którym pracuję). Czy istnieje inny sposób na wprowadzenie zmiany na stałe, poprzez edycję rejestru lub coś takiego?

Rozejrzałem się dookoła i nauczyłem się odtąd sporo na temat ustawiania zmiennych środowiskowych w systemie Windows. Jednak nie znalazłem jeszcze dokładnego duplikatu pytania, które odpowiadałoby moim potrzebom. Jeśli istnieje, daj mi znać.

Iszi
źródło
Setx nie jest dostarczany z XP. Jest w co najmniej jednym zestawie zasobów, ale zapominam, który z nich. Aby wprowadzić stałe zmiany zmiennych środowiskowych w wierszu poleceń, jest to zdecydowanie najłatwiejszy sposób. Możesz wprowadzić zmiany w rejestrze (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment), ale zmiany rejestru z wiersza poleceń również nie są bułką z masłem. Gdybym był tobą, napisałbym VBScript, aby to zrobić.
EBGreen,
@EBGreen Jestem trochę zaznajomiony z używaniem REGdo wprowadzania zmian w rejestrze. Jeśli chcesz opublikować to jako odpowiedź z sugestiami, jak zachować istniejącą ścieżkę, przynajmniej podniosę głos.
Iszi
1
Myślę, że według sugestii EBGreen zorientowałem się, jak to zrobić. Teraz chciałbym, aby istniał sposób na wymuszenie odświeżenia rejestru (i wypchnięcie do zmiennych środowiskowych) bez ponownego uruchamiania lub ponownego ładowania Eksploratora?
Iszi
1
@EBGreen Tak, tak to wygląda. Nawiasem mówiąc, jeśli masz trochę czasu na zrozumienie składni, czy mógłbyś opublikować prawdziwą odpowiedź? Wolałbym, żeby to nie stało się pytaniem, na które udzielono odpowiedzi.
Iszi
1
@lszi, powinieneś odpowiedzieć na własne pytanie. Dobra odpowiedź na dobre pytanie jest cenna, nawet jeśli sam na nie odpowiesz.
Myrddin Emrys

Odpowiedzi:

4

Poniższe dodaje „C: \ bin” do ścieżki, a następnie zapisuje nową ścieżkę do rejestru:

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

Testowałem to tylko na XP SP3, ale powinno działać również na nowszej wersji.

Wydaje mi się, że nowy użytkownik, który zaloguje się przed ponownym uruchomieniem komputera, może nie uzyskać nowej ścieżki.

Harry ma rację ze swoim komentarzem na temat% SystemRoot%, jeśli chcesz je zachować, musisz najpierw pobrać starą wartość ścieżki z rejestru:

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)
Peter Hahndorf
źródło
2
Należy pamiętać, że spowoduje to zmianę niektórych istniejących pozycji PATH poprzez rozszerzenie odniesień zmiennych środowiskowych. Na przykład standardowy wpis% SystemRoot% \ system32 zostanie zastąpiony przez c: \ windows \ system32. Ten szczególny przykład nie ma znaczenia, ponieważ SystemRoot jest stałą, ale jeśli ktoś skonfigurował ŚCIEŻKĘ z odniesieniem do zmiennej środowiskowej, która się zmienia, to ją złamiesz. (Robię to na niektórych moich komputerach, aby wskazać katalog bin w bieżącym Sun JDK.)
Harry Johnston,
Nowy skrypt nie działa tak, jak napisano, jeśli ścieżka zawiera nawiasy, np. Odniesienia do plików programu (x86).
Harry Johnston,
-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f
zaraz
źródło
2
Chociaż same polecenia mogą być przydatne, oczekujemy nieco więcej pracy w naszych pytaniach / odpowiedziach. Proszę wyjaśnić, w jaki sposób odpowiada to na pytanie PO.
Ƭᴇcʜιᴇ007