Обновление переменных среды из командной строки (Windows 2008 Server Core)
Довольно простой вопрос. Мне нужно обновить переменную среды PATH в Windows Server 2008 Core. Учитывая, что нет графического интерфейса, как это сделать из командной строки?
5 ответов
Для внесения постоянных изменений используйте setx
,
Например, чтобы добавить папку в конец текущего пути, используйте:
SETX Path %Path%;C:\MyFolder
Ваше изменение не будет видно в текущем cmd.exe
сессии, но это будет во всех будущих.
SETX
также позволяет устанавливать системные переменные окружения на удаленных системах.
Работа с переменной Path довольно сложна, поскольку она представляет собой комбинацию системных Path и пользовательских Path. Предыдущие ответы не учитывают это. Например
SETX PATH %PATH%;C:\MyFolder
установит пользовательский путь на весь текущий системный путь плюс пользовательский путь, а затем добавит к нему ';C:\MyFolder'. Если бы я использовал SETX /M PATH %PATH%;C:\MyFolder
тогда системный путь получит текущий пользовательский путь, добавленный к нему.
С помощью SETX
или же SETX /M
подходит для любой переменной среды, кроме Path. К сожалению, работа с переменными Path является проблемой, так как требует обновления реестра и добавления нового значения, мы должны сначала скопировать запись реестра в переменную окружения, добавить каталог, который мы добавляем в путь, а затем записать результаты обратно в реестр.
Есть еще одна проблема, которая заключается в том, что переменные Path хранятся в виде строк REG_EXPAND_SZ, и системный путь обычно содержит ссылки на %SystemRoot%
, Это означает, что любой механизм, который вы используете для чтения, манипулирования и последующей записи переменной Path, в идеале не должен ничего расширять.
Наконец, обычно нет никакой пользовательской переменной Path, означающей, что код, который обновляет Path, должен учитывать ошибку, которую вы получите, если попытаетесь прочитать переменную, которая не существует.
Вот пример кода, который может обновить путь путем обновления значений в реестре.
@echo off
setlocal ENABLEDELAYEDEXPANSION
rem
rem Add c:\bin to the path
rem
rem
rem
rem There are two values we can use for the PATHKEY. The one that starts
rem with HKEY_LOCAL_MACHINE sets the path that's used by all processes and
rem users on the system. The PATHKEY that starts with HKEY_CURRENT_USER
rem updates the part of the Path that only visible to processes running
rem under the current user account.
rem
set PATHKEY=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set PATHKEY=HKEY_CURRENT_USER\Environment
set PATHVAR=Path
set TMPFILE=%TEMP%\addpath.txt
set ADDPATH=c:\bin
rem
rem Read the Path value from the registry into a file. I could have coded
rem this with no temporary file by using:
rem for /f "delims=" %%i in ('REG QUERY "%PATHKEY%" /v "%PATHVAR%" 2>nul:') do set XLINE=%%i
rem However, having the temporary file was useful for debugging and as
rem updating the path is something we don't often do we don't care if
rem doing so is a bit slower.
rem
REG QUERY "%PATHKEY%" /v "%PATHVAR%" >"%TMPFILE%" 2>nul:
if errorlevel 1 goto :newpath
rem
rem REG QUERY outputs several lines. We only care about the last non-blank line
rem Fortunately, a 'for' loop ignores blank lines.
rem
for /f "delims=" %%i in (%TMPFILE%) do set XLINE=%%i
rem
rem Extract the value from the Path variable. Here's what we expect to see
rem in XLINE though with with spaces shown as ~ symbols:
rem
rem ~~~~Path~~~~REG_EXPAND_SZ~~~~Path-is-here..."
rem
rem See below for other ways we can extract the path value from XLINE.
rem
for /f "tokens=1,2,* delims= " %%i in ("!XLINE!") do set VARNAME=%%i & set VARTYPE=%%j & set XVALUE=%%k
rem
rem Append an element to the Path.
rem
set NEWPATH=!XVALUE!;!ADDPATH!
rem
rem Update the path
rem
REG ADD "%PATHKEY%" /v "%PATHVAR%" /t REG_EXPAND_SZ /d "!NEWPATH!" /f
goto :done
rem
rem The Path variable does not exist and so create it
rem
:newpath
REG ADD "%PATHKEY%" /v "%PATHVAR%" /t REG_EXPAND_SZ /d "!ADDPATH!"
goto :done
rem
rem Delete the temporary file.
rem
:done
del "%TMPFILE%"
endlocal
goto :eof
rem
rem Here are some variations for parsing XLINE to extract the value.
rem
rem
rem Quick and dirty method. It takes advantage of that REG QUERY returns a
rem line with four spaces, the variable name which we know is four
rem characters, four spaces, the variable type which we know is
rem REG_EXPAND_SZ and is 13 characters, four spaces, and then the value. As
rem some systems may be using REG_SZ Path strings the quick and dirty method
rem seems like a bad idea.
rem
set XVALUE=!XLINE:~29!
rem
rem One flaw with the method I used in the code above is that you are
rem allowed to have spaces in variable names. Here's a slight modification
rem to the code to support spaces in variable names. It takes advantage of
rem the fact that REG VIEW always puts four spaces each of the fields. We
rem first translate instances of four spaces into vertical bars and use that
rem character as the delimiter when parsing the line.
rem
rem I could have used any character as the delimiter as long as it's one
rem that will not appear in the variable name, the variable type, or as the
rem first character(s) of the variable's value. Some people use a tab here.
rem I chose not to do that in this example as the tabs are not visible.
rem
rem The code still has a flaw in that it will fail if the variable name
rem contains four consecutive spaces.
rem
set XLINE=!XLINE: =^|!
for /f "tokens=1,2,* delims=|" %%i in ("!XLINE!") do set VARNAME=%%i & set VARTYPE=%%j & set XVALUE=%%k
Из книги Мюллера "Администрирование ядра Windows Server 2008 - используйте WMIC"
Среда WMIC, где имя ="путь" SET VariableValue="C:\Temp;%PATH%
Как это всегда делалось со времен DOS:
SET PATH = C:\SomeDir
SET PATH = %PATH%;C:\AnotherDir
Если вы хотите установить путь или другую переменную среды с пробелами, я обнаружил, что это проще в использовании — вы можете просто запустить ее из командной строки в Server Core.
Общесистемные переменные среды находятся вHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
и пользовательские находятся вHKCU\Environment
.
Ответ @user3347790 содержит несколько веских аргументов: многие из приведенных выше методов заменяют путь расширенным путем (например,%ProgramFiles%
или%SystemRoot%
или%UserProfile%
будут постоянно расширяться), а также объединят пути к машине и пользователю в один. Исходя из этого, адаптируя код из этого ответа (если вам нужен код) или просто используяregedit
(если вы просто хотите внести несколько изменений вручную), возможно, будет безопаснее...