windows - example - SETX no agrega la ruta a la variable de ruta del sistema
setx variable windows (6)
¡ADVERTENCIA!
setx truncará el valor a 1024 caracteres.
Si lo usas para modificar PATH, podrías arruinar tu sistema.
Puedes usar este fragmento de PowerShell para agregar algo a tu ruta:
$new_entry = ''c:/blah''
$old_path = [Environment]::GetEnvironmentVariable(''path'', ''machine'');
$new_path = $old_path + '';'' + $new_entry
[Environment]::SetEnvironmentVariable(''path'', $new_path,''Machine'');
En caso de que no quiera volver a agregar una entrada ya existente, algo como esto será suficiente (vea una versión mejor más abajo):
$new_entry = ''c:/blah''
$search_pattern = '';'' + $new_entry.Replace("/","//")
$old_path = [Environment]::GetEnvironmentVariable(''path'', ''machine'');
$replace_string = ''''
$without_entry_path = $old_path -replace $search_pattern, $replace_string
$new_path = $without_entry_path + '';'' + $new_entry
[Environment]::SetEnvironmentVariable(''path'', $new_path,''Machine'');
Aquí una versión más nueva que estoy usando ahora (2017-10-23). Esta versión maneja correctamente las rutas anidadas. Por ejemplo, maneja el caso de PATH que contiene "c: / tool / foo" y desea agregar "c: / tool".
$desired_entry = ''C:/test''
$old_path = [Environment]::GetEnvironmentVariable(''path'', ''machine'');
$old_path_entry_list = ($old_path).split(";")
$new_path_entry_list = new-object system.collections.arraylist
foreach($old_path_entry in $old_path_entry_list) {
if($old_path_entry -eq $desired_entry){
# ignore old entry
}else{
[void]$new_path_entry_list.Add($old_path_entry)
}
}
[void]$new_path_entry_list.Add($desired_entry)
$new_path = $new_path_entry_list -Join ";"
[Environment]::SetEnvironmentVariable(''path'', $new_path,''Machine'');
He intentado a continuación el comando para agregar alguna ruta a la variable de la ruta del sistema por archivo por lotes:
setx PATH "%PATH%;C:/Program Files/MySQL/MySQL Server 5.5/bin"
He comprobado la ruta de la variable del sistema después de ejecutar el archivo por lotes anterior, la ruta anterior no está allí.
Puede ver el contenido de todas las ventanas de Variable value
a continuación:
C:/Program Files (x86)/AMD APP/bin/x86_64;C:/Program Files (x86)/AMDAPP/bin/x86;%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;%SYSTEMROOT%/System32/WindowsPowerShell/v1.0/;C:/ProgramFiles (x86)/ATI Technologies/ATI.ACE/Core-Static;
¿Qué estoy haciendo mal?
Me enfrenté con el mismo problema cuando intenté agregar variables de ruta relacionadas con fortran (Eclipse para c / c ++ / fortran)
Intenté SETX / M Path "% PATH%; C: / Users / mahidhai / cygwin64 / bin" en el símbolo del sistema como administrador. Recibí una advertencia que decía que los datos se habían truncado a 1024 caracteres y se habían almacenado.
Solución: ir directamente al archivo de registro. Ejecutar-> regedit Navegar al entorno
(Ruta completa: HKLM / SYSTEM / CurrentControlSet / Control / Session Manager / Environment)
Haga clic en el registro de ruta y agregue la variable de ruta directamente. O eliminar cualquier variable de ruta repetida.
Ahora, abra el símbolo del sistema y luego ejecute el mismo comando setx / M ruta "% ruta%"
La variable de ruta podría estar relacionada con C o C ++ o fortran
No se preocupe al editar el archivo de registro, se guardará permanentemente, no tenga miedo ya que las variables de entorno están en el administrador de sesiones.
Nunca debe usar setx para una ruta, ya que está limitado a 1024 caracteres, como se mencionó.
Podría usar reg agregar:
set pathkey="HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Environment"
for /F "usebackq skip=2 tokens=2*" %%A IN (`reg query %pathkey% /v Path`) do (reg add %pathkey% /f /v Path /t REG_SZ /d "%%B;C:/Program Files/MySQL/MySQL Server 5.5/bin")
o establezca pathkey = "HKEY_CURRENT_USER / Environment" para la ruta del usuario.
Luego para transmitir el cambio:
powershell -command "& {$md=/"[DllImport(`/"user32.dll/"/",SetLastError=true,CharSet=CharSet.Auto)]public static extern IntPtr SendMessageTimeout(IntPtr hWnd,uint Msg,UIntPtr wParam,string lParam,uint fuFlags,uint uTimeout,out UIntPtr lpdwResult);/"; $sm=Add-Type -MemberDefinition $md -Name NativeMethods -Namespace Win32 -PassThru;$result=[uintptr]::zero;$sm::SendMessageTimeout(0xffff,0x001A,[uintptr]::Zero,/"Environment/",2,5000,[ref]$result)}"
Para responder a la respuesta de @ Endoro (me falta el representante para comentar):
Si desea cambiar las variables de entorno de todo el sistema, debe utilizar / M , a la:
setx PATH "%PATH%;C:/Program Files/MySQL/MySQL Server 5.5/bin" /M
setx.exe es exigente con la ubicación de / M, BTW. Necesita estar al final.
no debe mirar las variables de entorno del sistema sino las variables de entorno de su usuario:
SETX /M Path "%PATH%;%ProgramFiles%/MySQL/MySQL Server 5.5/bin/
Agregará su ruta a la variable del sistema.