1 votos

¿Cómo configuro una variable de registro en código de lote con SETX?

Estoy tratando de hacer una herramienta personalizada que funciona con Vapor. Debido a que el usuario pudiera tener un directorio de instalación de mí mismo, quiero usar el SteamPath de registro de cadena de valor como una variable en mi código de lote para obtener la ruta de acceso correcta. Estoy intentando usar el siguiente código para hacer mi personalizados STEAMDIR variable:

@ECHO OFF

SETX STEAMDIR /K "HKEY_CURRENT_USER\Software\Valve\Steam\SteamPath" /m

IF NOT EXIST "STEAMDIR" GOTO :NOSTEAM
IF EXIST "STEAMDIR" GOTO :FOUND

:FOUND
CLS
SET msgboxTitle=Success!
SET msgboxBody=Steam found!
SET tmpmsgbox=%TEMP%\Message.vbs
IF EXIST "%tmpmsgbox%" DEL /F /Q "%tmpmsgbox%"
ECHO msgbox "%msgboxBody%",0,"%msgboxTitle%">"%tmpmsgbox%"
WScript "%tmpmsgbox%"
GOTO :END

:NOSTEAM
CLS
SET msgboxTitle=Error!
SET msgboxBody=You don't kave any Kenshi workshop mods installed!
SET tmpmsgbox=%TEMP%\Message.vbs
IF EXIST "%tmpmsgbox%" DEL /F /Q "%tmpmsgbox%"
ECHO msgbox "%msgboxBody%",0,"%msgboxTitle%">"%tmpmsgbox%"
WScript "%tmpmsgbox%"
GOTO :END

:END

Estoy a utilizar SETX como se demuestra EN este SS64 página, pero mis intentos han sido infructuosos. Cualquier ayuda es muy apreciada, pero me gustaría pedirle que soluciones mediante el uso de PowerShell o VisualBasic no ser sugerido. Me estas mucho y no tengo la experiencia suficiente en cualquiera de los idiomas de re-escribir mi código como todavía tengo cosas para agregar.

1voto

Nick Dixon Puntos 154

Usted tiene:

SET %STEAMDIR%=for /f "tokens=3" %%a in [...] do echo %%a

El primer problema es el uso de % sobre el lado izquierdo. En archivos de proceso por lotes, el porcentaje señales no son parte de la variable del nombre; son los operadores que desencadenan la expansión de esa variable. Usted no quiere que ellos en el lado izquierdo de una asignación (excepto en casos especiales), ya que en la actualidad su comando expande a esto – que intenta establecer una variable sin nombre:

SET =for /f "tokens=3" %%a in [...] do echo %%a

El uso correcto (de SET, no del todo) sería:

SET STEAMDIR=for /f "tokens=3" %%a in [...] do echo %%a

El segundo problema es que el lado derecho de asignaciones de variables es el valor. No es un comando que produce este valor. Estás literalmente a la configuración de la variable del contenido de los caracteres for /f ...

Otras lenguas tienen funciones o comandos "sustitución" de los operadores que permiten la ejecución de un comando y el uso de su salida como el valor de una capa exterior de comando (por ejemplo var=`cmd` o var=$(cmd) en bash), pero Windows Cmd.exe en realidad no tiene que.

En su lugar, el for /f ... invocación obtiene la salida y se ejecuta el interior de comandos (la parte después de la do), que puede entonces tener acceso a la salida como la única letra parámetro %%a, %%b, etc. Si la salida debe ser almacenado en un "normal" de la variable, que necesita ser hecho en la for ... do comando como este:

for /f "tokens=3" %%a in [...] do SET STEAMDIR=%%a

1voto

Louis Puntos 121

Su anterior formulación fue mejor. Además del problema señalado por grawity, su principal problema cuando se utiliza la for /f comando fue que produce variables independientes para cada token.

Por su valor de c:/program files (x86)/steam, se tendría:

%%a=c:/program files
%%b=(x86)/steam

Usted tendría que acumular los valores de %%a, %%b etc. el uso de código como:

setlocal EnableDelayedExpansion
for /f "usebackq tokens=3*" %%a in (`reg query "HKCU\Software\Valve\Steam" /V "SteamPath" ^| find "REG_SZ"`) do (
  set STEAMDIR=%%a
  set b=%%b
  set c=%%c
)  
if "%b%" neq "%%b" set STEAMDIR=%STEAMDIR% %b%
if "%c%" neq "%%c" set STEAMDIR=%STEAMDIR% %c%
echo STEAMDIR=%STEAMDIR%

La integridad, la he añadido una comprobación para el tercer componente, aunque no no es uno de su valor.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: