flash - una - Asignar salida de comando a variable en archivo por lotes
asignar salida comando variable batch (4)
Estoy tratando de asignar la salida de un comando a una variable, como en, estoy tratando de establecer la versión actual de flash a una variable. Sé que esto está mal, pero esto es lo que he intentado:
establecer var = reg query hklm / SOFTWARE / Macromedia / FlashPlayer / CurrentVersion>
o
reg query hklm / SOFTWARE / Macromedia / FlashPlayer / CurrentVersion >> set var
Sí, como puedes ver, estoy un poco perdido. ¡Cualquier y toda ayuda es apreciada!
Bien, aquí una muestra más compleja para el uso de For / F
:: Main
@prompt -$G
call :REGQUERY "Software/Classes/CLSID/{3E6AE265-3382-A429-56D1-BB2B4D1D}"
@goto :EOF
:REGQUERY
:: Checks HKEY_LOCAL_MACHINE/ and HKEY_CURRENT_USER/
:: for the key and lists its content
@call :EXEC "REG QUERY HKCU/%~1"
@call :EXEC "REG QUERY "HKLM/%~1""
@goto :EOF
:EXEC
@set output=
@for /F "delims=" %%i in (''%~1 2^>nul'') do @(
set output=%%i
)
@if not "%output%"=="" (
echo %1 -^> %output%
)
@goto :EOF
Lo empaqué en la función secundaria : EXEC así que todos sus desagradables detalles de implementación no ensucian el script principal. Así que tiene algo de un tutorial por lotes. Notas sobre el código:
- la salida del comando ejecutado mediante llamada: el comando EXEC se almacena en % de salida% . Batch cmd no se preocupa por los ámbitos, por lo que% output% también estará disponible en el script principal.
- el @ el comienzo es solo decoración y allí para suprimir el eco de la línea de comando. Puedes borrarlos a todos y simplemente poner un @echo apagado en la primera línea realmente no me gusta. Sin embargo, me parece que la depuración es mucho más agradable. Decoración Número dos es rápido - $ G. Está ahí para hacer que el símbolo del sistema se vea así ->
- Yo uso :: en lugar de rem
- la tilde (~) en % ~ 1 es para eliminar las citas del primer argumento
- 2 ^> nul está ahí para suprimir / descartar la salida de error de stderr . Normalmente lo harías a través de 2> nul . Bueno, el ^ el char de escape del lote está allí evita resolver el redirector (>) temprano. Hay un poco de simulacro de uso un poco más adelante en el script:
echo %1 -^>...
por lo que ^ permite que la salida a ''>'' a través de echo no haya sido posible. - incluso si la comparación en
@if not "%output%"==""
parece a la mayoría de los lenguajes de programación comunes, es quizás diferente de lo que esperaba (si no está acostumbrado a MS-batch). Bueno, elimina la ''@'' al principio. Estudia la salida. Cambie anot %output%==""
-rerun y considere por qué esto no funciona. ;)
No puede asignar una salida de proceso directamente a una var, necesita analizar la salida con un ciclo For / F:
@Echo OFF
FOR /F "Tokens=2,*" %%A IN (
''Reg Query "HKEY_CURRENT_USER/Software/Macromedia/FlashPlayer" /v "CurrentVersion"''
) DO (
REM Set "Version=%%B"
Echo Version: %%B
)
Pause&Exit
PD: Cambie la clave de registro utilizada si es necesario.
Ya se diseñó un método, sin embargo, de esta manera no necesita un archivo temporal.
for /f "delims=" %%i in (''command'') do set output=%%i
Sin embargo, estoy seguro de que esto tiene sus propias excepciones y limitaciones.
Esta publicación tiene un método para lograr esto
from (zvrba) Puede hacerlo redirigiendo la salida a un archivo primero. Por ejemplo:
echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%