Gibt es ein Befehlszeilentool, mit dem Umgebungsvariablen in Windows bearbeitet werden können?

15

Gibt es ein Befehlszeilentool, mit dem Umgebungsvariablen in Windows bearbeitet werden können?

Es wäre schön, wenn dies ein intelligentes Tool wäre, zum Beispiel:

  • Wenn Sie einen Pfad hinzufügen, beispielsweise die Variable PATH, und dieser Pfad ist bereits vorhanden, sollte dieser Eintrag nicht verdoppelt werden.
  • Das Einfügen eines neuen Pfads in die PATH-Variable sollte vor / nach einem anderen Pfad oder in einer bestimmten Reihenfolge (dem ersten, dem siebten, dem letzten usw.) möglich sein.
  • Es sollte möglich sein, nur einen Teil des Variablenwerts zu ändern (im Falle von PATH einen bestimmten Pfad aus einer Liste aller Pfade).

Und das letzte, aber nicht das letzte - ich möchte, dass meine Änderungen zwischen den Sitzungen beibehalten werden, sodass ein einfaches SET nicht in Frage kommt ...

Es gibt ein sehr nettes GUI-Tool für diesen Pfadeditor und ich brauche so etwas nur für die Befehlszeile.

Piotr Dobrogost
quelle
4
Technisch ja. Es heißt SET. Ich weiß, dass es nicht schön ist, aber Sie können nicht viel einfacher sein, als die Variablen mit den zur Verfügung stehenden Werkzeugen zu setzen.
Michael Todd
Interessant. Ich war mir sicher, dass es dafür ein ziemlich bekanntes Tool von Drittanbietern geben würde.
Sasha Chedygov
Welche Windows-Version verwenden Sie?
Sasha Chedygov
@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Antworten:

16

Ich kenne kein Tool, das dies tut, aber vielleicht können Sie den regBefehl verwenden:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path

um den aktuellen Pfad zu lesen, und

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d "newPath" /f

um deinen neuen Wert zu schreiben.

Sie benötigen Administratorrechte, um in HKLM auf die Rechte zugreifen zu können. Wenn das ein Problem ist, sollten Sie die Pfadeinstellung in benutzerspezifischen Modifikation HKCU\Environmentstatt.

Treb
quelle
1
Diese Antwort sollte akzeptiert worden sein, sie kann jede Umgebungsvariable ändern und kann sogar in eine Batch-Datei eingekapselt werden, sodass nur der Name und der neue Wert eingegeben werden müssen.
Tamara Wijsman
Wenn dies mit Vi kombiniert wird, würde es den Kriterien des Fragestellers näher kommen. Beispiel: Eine Batch-Datei, die den Pfad zu einer temporären Textdatei schreibt, öffnet diese in vi. Wenn Sie vi schließen, schreibt sie die Datei in den Pfad. Auf diese Weise können Sie Ihren Pfad einfach über die Befehlszeile bearbeiten. Ich habe so etwas in XP gemacht, mit einer Batch-Datei, einem Editor und diesen Reg-Befehlen.
Barlop
1
WARNUNG Kopieren und fügen Sie dies NICHT sinnlos ein, es sei denn, Sie möchten etwas
Dummes
7

Wenn Sie eine allgemeine Methode zum Festlegen einer Umgebungsvariablen benötigen und die Änderungen beibehalten möchten , ist setx.exe das zu verwendende Tool. Es kann jedoch nicht die "intelligenten" Dinge tun, nach denen Sie fragen ...

setx.exe ist in Windows Vista oder höher enthalten. Wenn Sie eine frühere Version von Windows verwenden, können Sie diese über den obigen Download-Link herunterladen.

bobbymcr
quelle
5

Für das aktuelle Programm gibt es path:

Zeigt einen Suchpfad für ausführbare Dateien an oder legt diesen fest.

PATH [[drive:]path[;...][;%PATH%]
PATH ;

Geben Sie ein PATH ;, um alle Suchpfadeinstellungen zu löschen und direkt cmd.exenur im aktuellen Verzeichnis zu suchen.

Geben Sie PATHohne Parameter ein, um den aktuellen Pfad anzuzeigen. Das Einschließen %PATH%in die neue Pfadeinstellung bewirkt, dass der alte Pfad an die neue Einstellung angehängt wird.

Dies ist jedoch so ziemlich das gleiche wie set PATH.

Damit Umgebungsvariablen bestehen bleiben, müssen Sie die Registrierung bearbeiten oder verwenden setx.

Joey
quelle
3

Ich habe gerade die Möglichkeit entdeckt, den Benutzern das Ausführen des Bearbeitungsdialogs für Umgebungsvariablen ohne erhöhte Berechtigungen zu ermöglichen.

Führen Sie im Startmenü Folgendes aus:

rundll32 sysdm.cpl,EditEnvironmentVariables
David Tersigni
quelle
2
+1 für eine Befehlszeilenmethode, um zum GUI-Bearbeitungs-Widget zu gelangen, da dies sicherlich einfacher ist als der Klickpfad, obwohl die Antwort nicht zum Thema gehört, da es bei Q darum geht, PATH über die Befehlszeile zu bearbeiten.
Matt Wilkie
2

setze PATH

(Hilfeset)

Sangretu
quelle
1
Dies gilt nur für die Terminalsitzung. Um Werte hinzuzufügen / zu ändern, müssen Sie auch den gesamten alten Pfad erneut eingeben.
John T
2
Nicht wahr. SET PATH =% path%; c: \ newpath
Michael Todd
2
Sie haben es immer noch eingegeben, nur nicht erweitert :) Das wird auch nicht gespeichert. Versuchen Sie, die Eingabeaufforderung zu schließen und eine neue zu öffnen, und überprüfen Sie dann Ihren Pfad.
John T
Er gab nicht an, ob es zwischen den Sitzungen bestehen bleiben musste.
Sangretu
4
Wenn Sie überprüft haben, was der Patheditor (sein Vorschlag) tut, wird es dauerhaft gespeichert. set PATH wird nur in Build-Skripten für Programme verwendet, da es temporär ist.
John T
2

Möglicherweise möchten Sie die gtools-Auflistung unter http://www.p-nand-q.com/gtools.html überprüfen

Es bietet eine Reihe von Befehlen für die Eingabeaufforderung wie

pathed /APPEND %CD% /USER

um beispielsweise den aktuellen Pfad anzufügen. Ich habe es nicht wirklich überprüft, um ehrlich zu sein, da ich mit der Verwendung einer GUI völlig in Ordnung bin.

Andere Optionen sind:

  /MACHINE: print machine PATH
     /USER: print user PATH
      /ADD: add variable at the head
   /APPEND: add variable at the tail
   /REMOVE: remove path / index
     /SLIM: strip duplicate vars
      /ENV: environment variable, defaults to PATH

Ich nehme an, Sie haben sich zusammen mit welchem ​​aus derselben Sammlung ein paar gute Werkzeuge besorgt. Welche "findet ausführbare Dateien auf dem Pfad".

 /EXTENSION: search for extension , can be a ; separated list
       /DIR: add directory , can be a ; separated list
 /RECURSIVE: search directories recursively
    /SINGLE: stop after the first find result
       /ENV: environment variable, defaults to PATH
FILE {FILE}: one or more files to find

Quelle: http://op111.net/82/

hugo der hungrige
quelle
1
Können Sie erklären, worauf Sie verweisen? Nur-Link-Antworten können ungültig werden, wenn der verlinkte Inhalt nicht mehr verfügbar ist.
bwDraco
Shure. Entschuldigung, ich bezog mich implizit auf die Frage.
hugo der hungrige
Scheint die URL für Gtools und pathed ist jetzt tot. p-nand-q.com/gtools.html
DevPlayer
1

Ich habe dafür eine Reihe von Batch-Skripten geschrieben. addpath.bat fügt dem Pfad Elemente hinzu, rmpath.bat entfernt Elemente aus dem Pfad und lpath.bat listet nur den Pfad auf. Aber dann brauchte ich ein paar Support-Skripte, also gibt es auch chkpath.bat.

Es war nicht trivial und erforderte tr.exe und cat.exe, ein paar Dienstprogramme im Unix-Stil. Der Grund ist nicht trivial: Keine Backticks in cmd.exe (obwohl Sie dafür for-Schleifen verwenden können) und kurze Namen versus lange Namen.

addpath.bat:

@echo off
setlocal
set cwd=%~dps0

goto testit

:loopy

call %cwd%chkpath "%~1"
if %errorlevel%==2 (
  set path=%path%;%~1
)

shift

:testit
if not _%1==_ goto loopy


call %cwd%lpath.bat

endlocal & set path=%path%

ChkPath.bat:

@echo off
goto START

-------------------------------------------------------
chkpath.bat

checks path for existence of the given segment.
Returns 1 if present, 2 if not present, 0 if not checked.

The matching and checking complicated by case sensitivity and "short pathnames".

created sometime in 2003 and lovingly maintained since then.


-------------------------------------------------------

:START
setlocal enabledelayedExpansion
set rc=0
set cwd=%~dps0
set curdrive=%~d0
set tr=%curdrive%\bin\tr.exe
set regexe=%windir%\system32\reg.exe


if _%1==_ goto Usage


@REM convert arg 1 to a fully-qualified, short path name,
@REM and then convert to uppercase.
set toupper=%~fs1
call :ToUpper
set tocheck=%toupper%


if not _%TEMP%==_ goto GotTemp
call :gettemp


:GotTemp
set d=%DATE:~4%
set stamp=%d:~6%%d:~3,2%%d:~0,2%%TIME::=%
set d=
set tempfile1=%TEMP%\chkpath1-%stamp%.tmp

echo %path% | %tr% ; \n  >  %tempfile1%

@REM check each element in the path for the match:
for /f  "delims=^" %%I in (%tempfile1%) do (
  if !rc!==0 (
call :CheckElt "%%I"
  )
)

if %rc%==0 set rc=2
goto END


--------------------------------------------
* checkelt
*
* check one element in the path to see if it is the same
* as the TOCHECK string. The element is first canonicalized.
*

:CheckElt
@REM remove surrounding quotes
set ERF=%1
if [x%ERF%]==[x] goto CheckEltDone
@REM convert to fully-qualified, short paths, uppercase
set TOUPPER=%~fs1%
call :ToUpper
if _%TOCHECK% == _%TOUPPER% set rc=1
:CheckEltDone
goto:EOF
--------------------------------------------


--------------------------------------------
* backtick
*
* invoke a command and return the result as a string.
* This is like backtick in csh or bash.
* To call, set variable BACKTICK to the command to be run.
* The result will be stored in the env variable of the same name.
*

:backtick
FOR /F "usebackq delims=" %%i IN (`%backtick%`) DO (
  SET backtick=%%i
)
goto backtick_done
:backtick_none
  SET backtick=nothing to exec
:backtick_done
goto:EOF
--------------------------------------------


--------------------------------------------
* gettemp
*
* get the temporary directory, as stored in the registry.
* Relies on backtick.
*
* The result set TEMP.
*

:gettemp
set regkey=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
set regvalname=Local AppData
set backtick=%regexe% query "%regkey%" /v "%regvalname%"
call :backtick
for /f "tokens=4" %%a in ("%backtick%") do (
  set temp=%%a
)
goto:EOF
--------------------------------------------



--------------------------------------------
* ToUpper
*
* Convert a string to all uppercase.
* To call, set variable TOUPPER to the thing to be converted.
* The result will be stored in the env variable of the same name.
*

:ToUpper
  FOR /F "usebackq delims=" %%I IN (`echo %toupper% ^| %tr% a-z A-Z`) DO (
SET toupper=%%I
  )
goto:EOF
--------------------------------------------


--------------------------------------------
:CleanUp
  if _%tempfile1%==_ goto CleanUpDone
  if exist %tempfile1% del %tempfile1%
  :CleanUpDone
goto:EOF
--------------------------------------------


--------------------------------------------
:Usage
echo.
echo Usage: chkpath ^<path^>
echo checks if path element is included in path variable.
echo returns 1 if yes, 2 if no, 0 if not checked.
echo.
goto END
--------------------------------------------


:END
call :CleanUp

:ReallyEnd

endlocal & set errorlevel=%rc%
@REM set errorlevel=%rc%
@REM echo %errorlevel%

lpath.bat:

@echo.
@set curdrive=%~d0

@REM This form post-fixes a | at the end of each path element. Useful for debugging trailing spaces.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e s/PATH=// -e 's/;/^|\n/g' -e 's/$/^|/g'

@REM This form shows bare path elements.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e 's/PATH=//' -e 's/;/^\n/g'
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.
Cheeso
quelle
Ich denke, die forSchleife könnte anstelle von tr/ catauch verwendet werden.
user1686
0

Der Pfad-Manager (pathman.exe) aus den Resource Kit-Tools von Windows Server 2003 ist die beste Übereinstimmung, die ich finden konnte. Es war bereits im NT Resource Kit verfügbar.

Piotr Dobrogost
quelle
Vielleicht versuchensetx.exe
n611x007
@ n611x007 setxsteht für allgemeine Umgebungsvariablen. pathmandient speziell zum Manipulieren (dh Parsen ) des Pfades.
Synetech
0

Wie überprüfe ich, ob das Verzeichnis in% PATH% existiert? on Stack Overflow bietet eine hervorragende Beschreibung dessen, was die Bearbeitung von Windows-Pfaden zusammen mit einer Batchdatei schwierig macht, um sie zu überwinden. Es addpath.batwar für mich neu, herauszufinden, wie man es richtig einsetzt, und es hat ein wenig Übung gekostet, da es sich um eine Aufrufstruktur handelt. Aber das funktioniert:

set _path=C:\new\directory\to\add\to\path
call addpath.bat _path
set _path=

und wiederholte Brände fügen das neue Verzeichnis nicht hinzu, wenn es bereits vorhanden ist. Dies hat keine Auswirkung darauf, dass die Änderungen über Sitzungen hinweg bestehen bleiben.

Matt Wilkie
quelle