Comment définir la sortie des commandes en tant que variable dans un fichier de commandes

243

Est-il possible de définir la sortie d'une instruction d'un fichier batch sur une variable, par exemple:

findstr testing > %VARIABLE%

echo %VARIABLE%
Dennis
la source

Réponses:

275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

J'utilise toujours USEBACKQ pour que si vous avez une chaîne à insérer ou un nom de fichier long, vous pouvez utiliser vos guillemets doubles sans visser la commande.

Maintenant, si votre sortie contient plusieurs lignes, vous pouvez le faire

SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL
Mechaflash
la source
3
A travaillé pour moi dans le système Win7, merci! (et oui, c'est 7 ans d'utilité) PS N'oubliez pas d'étendre% à %% dans les commandes!
Dmitry Ilukhin
Cela fonctionne très bien ... sauf si la sortie contient des points d'exclamation (!), Car ils seront interprétés comme des caractères de contrôle lors de l'utilisationENABLEDELAYEDEXPANSION
JonathanDavidArndt
Cela fonctionne bien, sauf si vous devez l'utiliser, |auquel cas cela ne fonctionne pas.
Matt Vukomanovic
6
@MattVukomanovic, cela fonctionne pour moi en utilisant ^|à la place de |, comme décrit ici
AST
Est-il possible de capturer le code de sortie de commandtoute façon, s'il vous plaît? Je suis sûr qu'il retourne un code non nul mais %ERRORLEVEL%contient toujours 0, peu importe où j'essaye de l'utiliser (même à l'intérieur du dobloc). Donc, je suppose qu'une partie de cette forconstruction la remplace. BTW Il est incroyable de voir à quel point un code fou est nécessaire pour quelque chose d'aussi élémentaire.
David Ferenczy Rogožan
69

J'ai trouvé ce fil sur ce truc Interweb. Se résume à:

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

Vous pouvez également rediriger la sortie d'une commande vers un fichier temporaire, puis placer le contenu de ce fichier temporaire dans votre variable, comme ici. Cependant, cela ne fonctionne pas avec une entrée multiligne.

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

Crédits au thread sur Tom's Hardware.

Dolphy
la source
3
Le seul inconvénient de l'approche par le bas (qui est préférable à tous les autres égards) est qu'elle ne fonctionne pas avec une sortie multiligne.
dgo
Pour VER, j'irais dans un autre sens: pour / f "tokens = 2 delims = [,]" %% a in ('ver') définissez la version %% a echo% version%
Hardoman
1
vous êtes le deuxième résultat pour likesuchashereby - imagebin.ca/v/4NPSlQFgifce
Shmuel Kamensky
Votre deuxième exemple m'a beaucoup aidé à écrire un fichier de commandes pour vérifier la version de chromedriver.exe par rapport à un fichier texte contenant un numéro de version. Je suis un ancien dinosaure DOS et je n'étais pas au courant des commutateurs de la commande set. Les autres trucs étaient exagérés pour moi.
Bill Hileman
47

en une seule ligne:

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

la sortie de la commande sera définie en% g puis en VAR.

Plus d'informations: https://ss64.com/nt/for_cmd.html

Yuri
la source
19
Mon lot ne s'est pas exécuté avec "% g". Il a fonctionné avec "%% g".
Santiago Villafuerte
5
+ Santiago Villafuerte: oui, si vous exécutez à partir d'un fichier batch, mais si vous souhaitez l'exécuter vous-même à partir de la ligne de commande (par exemple: pour le tester avant de le placer dans le fichier batch), vous utilisez un seul%.
Brent Rittenhouse du
19

Pour lire un fichier ...

set /P Variable=<File.txt

Pour écrire un fichier

@echo %DataToWrite%>File.txt

Remarque; avoir des espaces avant le caractère <> entraîne l'ajout d'un espace à la fin de la variable, également

Pour ajouter à un fichier, comme un programme d'enregistrement, commencez par créer un fichier avec une seule touche d'entrée appelée e.txt

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

votre journal ressemblera à ceci

Entry1
Entry2 

etc

Quoi qu'il en soit, quelques choses utiles


la source
Merci pour votre réponse. BTW "set / P Variable = <File.txt" lit seulement la première ligne du fichier
Deepscorn
19

Ces réponses étaient toutes si proches de la réponse dont j'avais besoin. C'est une tentative de les développer.

Dans un fichier batch

Si vous exécutez à partir d'un .batfichier et que vous voulez une seule ligne qui vous permet d'exporter une commande compliquée comme jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonvers une variable nommée, AWS_ACCESS_KEYvous voulez ceci:

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

Sur la ligne de commande

Si vous êtes à l' C:\invite, vous voulez une seule ligne qui vous permet d'exécuter une commande compliquée comme jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.jsonune variable nommée, AWS_ACCESS_KEYalors vous voulez ceci:

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

Explication

La seule différence entre les deux réponses ci-dessus est que sur la ligne de commande, vous utilisez un seul% dans votre variable. Dans un fichier batch, vous devez doubler sur les signes de pourcentage (%%).

Étant donné que la commande comprend des deux-points, des guillemets et des parenthèses, vous devez inclure la USEBACKQligne dans les options afin de pouvoir utiliser des guillemets arrière pour spécifier la commande à exécuter, puis toutes sortes de caractères amusants à l'intérieur.

Ryan Shillington
la source
13

Si vous ne voulez pas sortir dans un fichier temporaire puis lire dans une variable, ce code stocke le résultat de la commande directement dans une variable:

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

Si vous souhaitez mettre la chaîne de recherche entre guillemets:

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

Si vous souhaitez stocker ce code dans un fichier batch, ajoutez un symbole% supplémentaire:

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

Un exemple utile pour compter le nombre de fichiers dans un répertoire et stocker dans une variable: (illustre la tuyauterie)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

Notez l'utilisation de guillemets simples au lieu de guillemets doubles "ou d'accent grave" dans les crochets de commande. C'est une alternative plus propre à delims, tokensou usebackqen forboucle.

Testé sur Win 10 CMD.

Zimba
la source
1
cd %windir%\system32\inetsrv

@echo off

for /F "tokens=* USEBACKQ" %%x in (      
        `appcmd list apppool /text:name`
       ) do (
            echo|set /p=  "%%x - " /text:name & appcmd.exe list apppool "%%x" /text:processModel.identityType
       )

echo %date% & echo %time%

pause
Dado
la source
Je ne vois pas comment cela résout la question. appcmdn'est pas un programme standard et je ne vois pas où vous affectez la sortie du programme à une variable. Enfin, vous avez besoin de plus d'explications
jeb
-3

Je l'ai testé comme ça et ça a fonctionné:

SET /P Var= | Cmd

En canalisant la commande dans une variable, l'invite insérera le résultat de la commande " Cmd" dans la variable " Var".

Mettre à jour:

Cela ne fonctionne pas, mon mauvais, le script que j'ai fait était le suivant:

SET /P Var= | dir /b *.txt
echo %Var%

Il montrait en fait disons " test.txt", mais il montrait en fait le résultat de la " dir /b *.txt" commande, pas le echo %var%. J'ai été confus car les deux sorties étaient les mêmes.

QcAlexN
la source
3
Si vous l'aviez voulu, pipe the command into a variable promptvous devriez l'avoir écrit dir /b *.txt | SET /P Var=pour obtenir la bonne direction de votre tuyau. PS: ça ne marche pas non plus!
Jesse Chisholm
-19

J'espère que cette aide

set a=%username%
echo %a%    
set a="hello"
echo %a%
Ben2014
la source
5
Non, cela ne répond pas à la question.La question est sur le point d'obtenir la sortie d'une commande dans une variable
jeb
Le moyen le plus simple consiste à écrire dans un fichier et à le lire à partir de ce fichier. findstr "test" test.txt> testoutput.txt set /pa=<testoutput.txt echo% a%
Ben2014