Hoe voeg ik met setx toe aan de Windows PATH-variabele? Vreemde problemen hebben

Ik wil de Windows PATH-variabele wijzigen met setx. Het volgende werkt minstens 50% van de tijd op Windows 8:

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

Als het de fout geeft “het standaardargument kan maar 2 keer worden gebruikt”, dan werkt het volgende soms:

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

Het verschil is dat we het tweede argument tussen aanhalingstekens hebben gezet. Ik geloof dat de aanhalingstekens nodig zijn wanneer %PATH%wordt uitgebreid met spaties.

Ik ben echter een aantal rare problemen tegengekomen op Windows 7. Op een bepaalde Windows 7-machine had ik dit probleem:

echo %PATH%

Het drukt af:

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\

Dan doe ik dit:

setx PATH "%PATH%;C:\Quux\"

Dan staat er “Fout: afgekapt op 1024 tekens.” Laten we nu eens kijken wat PATH bevat:

echo %PATH%

Het drukt af:

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B

…en het wordt afgebroken bij 1.024 tekens. Het liep over vanwege de duplicaten. Ook interessant: de waarde van PATH verandert ondanks het feit dat setxeen fout veroorzaakte en niet “Succes” zei.

Ik heb dit vreemde gedrag verschillende keren kunnen herhalen (gelukkig had ik de originele inhoud van PATH opgeslagen).

Op dit moment is de enige trefzekere manier die ik ken om aan het PATH toe te voegen de volgende:

  1. echohet PAD.

  2. Kopieer de inhoud van PATH naar een tekstbestand en voeg handmatig ;C:\Python27\;C:\Python27\Scripts\toe aan het einde van het PATH.

  3. Kopieer het hele ding uit het tekstbestand.

  4. setx PATH "<paste the string here>"

Dat proces werkt elke keer op zowel Windows 7 als Windows 8.

Ik zou dit echt in één commando moeten kunnen doen. Wat doe ik verkeerd?


Antwoord 1, autoriteit 100%

Voer cmduit als beheerder en:

setx /M PATH "%PATH%;<your-new-path>"

De /M optie stelt de variabele in op SYSTEM scope. Het standaardgedrag is om het in te stellen voor de GEBRUIKER.

TL;DR

De truncatie vindt plaats omdat wanneer u %PATH%echo, u de aaneenschakeling van de SYSTEEM- en USER-waarden krijgt, dus wanneer u het in uw tweede argument toevoegt aan setx, de commando zal proberen om de inhoud van zowel SYSTEM als USER binnen de USER var. Als je nogmaals echo, wordt het resultaat verdubbeld.

De optie /Mvereist beheerdersrechten, dus u moet uw terminal openen met “uitvoeren als beheerder”, anders mislukt setxmet “toegang tot registerpad is geweigerd “.

Opmerking: je zult de nieuwe waarde niet zien wanneer je %PATH%echo net nadat je het op deze manier hebt ingesteld, je moet cmdsluiten en opnieuw openen.

Als u de werkelijke waarden wilt controleren die zijn opgeslagen in het register, moet u deze vraag.


Antwoord 2, autoriteit 36%

Dit werkt perfect:

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%B
setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"

Het eerste commando haalt de USER-omgevingsvariabele ‘PATH’ op in de variabele ‘my_user_path’
De 2e regel wordt voorafgegaan door ‘C:\Python27;C:\Python27\Scripts;’ naar de USER-omgevingsvariabele ‘PATH’


Antwoord 3, autoriteit 7%

Als iemand het in PowerShell wil gebruiken, werkt het als volgt,

Voer Powershell uit als beheerder

Dan

setx /M PATH "$Env:PATH;<path to add>"

Om te verifiëren, opent u een andere Powershell en bekijkt u PATH zoals hieronder,

$Env:PATH

Antwoord 4, autoriteit 5%

Als u niet verplicht bent tot setx, kunt u een alternatieve opdrachtregeltool gebruiken, zoals pathed. Er is een uitgebreidere lijst met alternatieve PATH-editors op https://superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712

Je kunt de registerwaarde ook rechtstreeks bewerken, wat setxdoet. Meer hierover in dit antwoord.

Het is raar dat je %PATH%wordt afgekapt bij 1024 tekens. Ik dacht dat setxdat probleem niet had. Hoewel u waarschijnlijk de ongeldige padinvoeren moet opschonen.


Antwoord 5, autoriteit 5%

Zonder beheerdersrechten is de enige manier die voor mij werkte een bat-bestand dat de volgende code bevat:

for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"

De code is de combinatie van de antwoorden https://stackoverflow.com/a/45566845/4717152en https://stackoverflow.com/a/10292113/4717152


Antwoord 6, autoriteit 4%

Helaas kunt u met OOTB-tools het systeempad of het gebruikerspad niet direct/gemakkelijk toevoegen. Als je bij OOTB-tools wilt blijven, moet je het SYSTEEM- of USER-pad opvragen, die waarde opslaan als een variabele, dan je toevoegingen toevoegen en het opslaan met setx. De twee onderstaande voorbeelden laten zien hoe u beide kunt ophalen, opslaan en toevoegen. Maak geen rommel met %PATH%, het is een aaneenschakeling van USER+SYSTEM en zal veel duplicatie in het resultaat veroorzaken. Je moet ze splitsen zoals hieronder getoond…

Toevoegen aan systeem PATH

for /f "usebackq tokens=2,*" %A in (`reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) do set SYSPATH=%B
setx PATH "%SYSPATH%;C:\path1;C:\path2" /M

Toevoegen aan gebruikerspad

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%B
setx PATH "%userPATH%;C:\path3;C:\path4"

Antwoord 7, autoriteit 2%

Ik had dezelfde problemen en heb nu een gemakkelijke oplossing gevonden.

Pathman gebruiken.

pathman /as %M2%

Voegt bijvoorbeeld %M2% toe aan het systeempad. Niets meer en niets minder. Geen problemen meer met het verkrijgen van een combinatie van gebruikers-PATH en systeem-PATH. Nooit meer moeite doen om de juiste waarden uit het register te halen…

Geprobeerd met Windows 10


Antwoord 8, autoriteit 2%

setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

Dit zou het toevoegen aan het systeemomgevingsvariabele pad moeten doen zonder dat er extra’s worden toegevoegd, en het origineel intact houden zonder enig verlies van gegevens. Ik heb deze opdracht gebruikt om het probleem te verhelpen dat McAfee’s Web Control doet met de Outlook-desktopclient van Microsoft.

De aanhalingstekens worden gebruikt in de padwaarde omdat de opdrachtregel spaties als scheidingstekens ziet en zal proberen de volgende waarde in de opdrachtregel uit te voeren. De aanhalingstekens overschrijven dit gedrag en behandelen alles binnen de aanhalingstekens als een string.


Antwoord 9, autoriteit 2%

Ik wilde alleen herhalen: het eerdere antwoordvan Manohar Reddy Poreddyis de juiste.

Er zijn een aantal verbeteringen die kunnen worden aangebracht, waarvan ik dacht dat ze nuttig zouden kunnen zijn om te delen:

@echo off
REM -- Use directory where script is located. For current working directory, use %CD%
set CURRENT_DIR=%~dp0
REM -- Great example from Strawberry Perl's portable shell launcher:
if #%CURRENT_DIR:~-1%# == #\# set CURRENT_DIR=%CURRENT_DIR:~0,-1%
REM -- Load the user PATH from the registry, making sure it is not blank
reg query HKCU\Environment /v PATH 1>nul 2>&1
if ERRORLEVEL 1 goto skipLoadPath
for /f "usebackq tokens=2,*" %%A in (`reg query HKCU\Environment /v PATH`) do set MY_USER_PATH=%%B
REM -- Optionally, checks if this directory is already part of the user PATH
REM -- This will avoid duplication, and allow this to be run multiple times,
REM -- but if a sub-directory of the current is already part of the user PATH,
REM -- this script will simply not do anything
echo %MY_USER_PATH%|find "%CURRENT_DIR%" >nul
if errorlevel 1 (goto skipLoadPath) else (goto skipSetXPath)
:skipLoadPath
REM -- Avoid adding a useless semicolon to the previous user PATH
if not "" == "%MY_USER_PATH%" set "MY_USER_PATH=%MY_USER_PATH%;"
REM -- Permanently set the following location as part of the system path
setx PATH "%MY_USER_PATH%%CURRENT_DIR%" >nul 2>&1
REM -- This will update the current environment, since SETX only updates the registry
set "PATH=%PATH%;%MY_USER_PATH%%CURRENT_DIR%"
:skipSetXPath

10

Ik had dergelijke problemen met het beheren van mijn computerlabs toen de PATH PATH% Milieuvariabele 1024 tekens benaderde die ik een Powershell-script heb geschreven om het te repareren.

U kunt de code hier downloaden: https: // galerij.technet.microsoft.com/scriptcenter/edit-and-shorten-path-37ef3189

U kunt het ook gebruiken als een eenvoudige manier om padvermeldingen veilig toe te voegen, te verwijderen en te ontleden. Genieten.

Other episodes