Atsortingbuer la sortie d’un programme à une variable

Je dois affecter la sortie d’un programme à une variable à l’aide d’un fichier de commandes MS.

Donc, dans le shell GNU Bash, j’utiliserais VAR=$(application arg0 arg1) . J’ai besoin d’un comportement similaire sous Windows en utilisant un fichier de commandes.

Quelque chose comme set VAR=application arg0 arg1 .

Un moyen est:

 application arg0 arg1 > temp.txt set /p VAR= 

Un autre est:

 for /f %%i in ('application arg0 arg1') do set VAR=%%i 

Notez que le premier % en %%i est utilisé pour échapper au % après et est nécessaire lorsque vous utilisez le code ci-dessus dans un fichier de commandes plutôt que sur la ligne de commande. Imaginez, votre test.bat a quelque chose comme:

 for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i echo %datetime% 

En complément de cette réponse précédente , les pipes peuvent être utilisées dans une déclaration for, échappée par un symbole caret:

  for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i 

@OP, vous pouvez utiliser pour les boucles pour capturer le statut de retour de votre programme, s’il produit autre chose que des nombres

en supposant que la sortie de votre application est un code de retour numérique, vous pouvez effectuer les opérations suivantes:

 application arg0 arg1 set VAR=%errorlevel% 

En cours d’exécution: for /f %%i in ('application arg0 arg1') do set VAR=%%i je for /f %%i in ('application arg0 arg1') do set VAR=%%i erreur: %% for /f %%i in ('application arg0 arg1') do set VAR=%%i inattendu à ce moment. Comme correctif, je devais exécuter ci-dessus for /f %i in ('application arg0 arg1') do set VAR=%i

En plus de la réponse, vous ne pouvez pas utiliser directement les opérateurs de redirection de sortie dans la partie set de for loop (par exemple, si vous souhaitez masquer la sortie stderror d’un utilisateur et fournir un message d’erreur plus joli). Au lieu de cela, vous devez leur échapper avec un caractère caret ( ^ ):

 for /f %%O in ('some-erroring-command 2^> nul') do (echo %%O) 

Référence: redirect la sortie de la commande pour la boucle du script de traitement par lots

 @echo off SETLOCAL ENABLEDELAYEDEXPANSION REM Prefer backtick usage for command output reading: REM ENABLEDELAYEDEXPANSION is required for actualized REM outer variables within for's scope; REM within for's scope, access to modified REM outer variable is done via !...! syntax. SET CHP=C:\Windows\System32\chcp.com FOR /F "usebackq tokens=1,2,3" %%i IN (`%CHP%`) DO ( IF "%%i" == "Aktive" IF "%%j" == "Codepage:" ( SET SELCP=%%k SET SELCP=!SELCP:~0,-1! ) ) echo actual codepage [%SELCP%] ENDLOCAL 

J’ai écrit le script ping google.com toutes les 5 secondes et enregistré les résultats avec l’heure actuelle. Ici vous pouvez trouver la sortie aux variables “commandLineStr” (avec des index)

 @echo off :LOOPSTART echo %DATE:~0% %TIME:~0,8% >> Pingtest.log SETLOCAL ENABLEDELAYEDEXPANSION SET scriptCount=1 FOR /F "tokens=* USEBACKQ" %%F IN (`ping google.com -n 1`) DO ( SET commandLineStr!scriptCount!=%%F SET /a scriptCount=!scriptCount!+1 ) @ECHO %commandLineStr1% >> PingTest.log @ECHO %commandLineStr2% >> PingTest.log ENDLOCAL timeout 5 > nul GOTO LOOPSTART