web-dev-qa-db-fra.com

Affecter la sortie de la commande à une variable dans un fichier batch

J'essaie d'attribuer la sortie d'une commande à une variable - en tant que, j'essaie de définir la version flash actuelle sur une variable. Je sais que c'est faux, mais voici ce que j'ai essayé:

set var = requête d'interrogation hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion>

ou

requête d'enregistrement hklm\LOGICIEL\Macromedia\FlashPlayer\CurrentVersion >> set var

Oui, comme vous pouvez le voir, je suis un peu perdu. Toute aide est appréciée!

38
user2283234

Une méthode a déjà été conçue, mais de cette façon, vous n’avez pas besoin d’un fichier temporaire.

for /f "delims=" %%i in ('command') do set output=%%i

Cependant, je suis sûr que cela a ses propres exceptions et limitations.

80
Prof Pickle

Ce post a une méthode pour y parvenir

de (zvrba) Vous pouvez le faire en redirigeant d'abord la sortie vers un fichier. Par exemple: 

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%
9
Ian Kenney

Vous ne pouvez pas affecter une sortie de processus directement dans une var, vous devez analyser la sortie avec une boucle 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

http://ss64.com/nt/for_f.html

PS: Modifiez la clé de registre utilisée si nécessaire.

2
ElektroStudios

Ok, voici quelques exemples plus complexes pour l’utilisation 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

Je l'ai emballé dans la sous-fonction : EXEC afin que tous ses détails de mise en œuvre vilains n'entrent pas dans le script principal. code:

  1. la sortie de la commande exécutée via appel: EXEC commande est stockée dans % sortie%. Batch cmd ne se soucie pas des portées, donc% output% sera également disponible dans le script principal.
  2. le @ au début n'est que décoration et il y a lieu de supprimer l'écho de la ligne de commande. Vous pouvez les supprimer tous et simplement mettre quelques @echo off à la première ligne est vraiment pas comme ça. Cependant, comme cela, je trouve que le débogage est bien plus agréable. La décoration numéro deux est Invite - $ G. Il est là pour que Invite de commande ressemble à ceci (>> 
  3. J'utilise :: au lieu de rem
  4. le tilde (~) dans % ~ 1 consiste à supprimer les guillemets du premier argument
  5. (2 ^> nul} _ est là pour supprimer/ignorer la sortie d'erreur stderr. Normalement, vous le feriez via 2> nul. Eh bien, le ^ le caractère d'échappement par lots évite une résolution rapide du redirecteur (>). Il y a quelques utilisations simulare un peu plus tard dans le script: echo %1 -^>... donc il ^ rend possible la sortie d'un '>' via echo ce qui n'aurait pas été possible d'autre.
  6. même si la comparaison à @if not "%output%"=="" ressemble à celle de la plupart des langages de programmation courants, elle est peut-être différente de ce à quoi vous vous attendiez (si vous n'êtes pas habitué à MS-batch). Enlevez bien le '@' au début. Étudiez le résultat. Changez-le en not %output%==""- réexécutez et demandez-vous pourquoi cela ne fonctionne pas. ;)
1
Nadu

C'est un travail pour moi

@FOR /f "delims=" %i in ('reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion') DO set var=%i
echo %var%
0
Chetabahana