2010-02-24 8 views
195

Je dois affecter la sortie d'un programme à une variable à l'aide d'un fichier séquentiel MS.Affectation de la sortie d'un programme à une variable

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

Quelque chose comme set VAR=application arg0 arg1.

Répondre

292

Une façon est:

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

Une autre est:

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

Notez que la première % en %%i est utilisé pour échapper à la % 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% 
+7

Ceci est une super astuce, je me demande pourquoi cela ne fonctionne pas avec un tuyau –

+11

Cela ne fonctionne que pour la sortie qui est une seule ligne de texte (les lignes suivantes omises après le premier saut de ligne). – GroovyCakes

+14

@Machta le tuyau doit être échappé avec un signe^devant lui, à l'intérieur de l'expression en parens. Exemple: 'pour/f" tokens = 3 "%% i in ('route print^| findstr" \ <0.0.0.0\> "') Définissez" myVar = %% i "' –

6

en supposant que la sortie de votre application est un code numérique de retour, vous pouvez faire le

application arg0 arg1 
set VAR=%errorlevel% 
+2

Malheureusement, la sortie est une chaîne. – initialZero

+0

ok. Je vais garder cela pour la postérité, mais jetez un oeil au lien @ jdigital, qui parle de la sortie de tuyauterie dans un fichier temporaire. – akf

+0

La sortie du programme vers stdout et stderr est différente de la valeur de retour de l'entier. Un programme peut renvoyer une valeur entière comme dans l'exemple ci-dessus, tout en envoyant une chaîne à la console (ou redirigée vers un fichier ou ailleurs). Ils ne s'excluent pas mutuellement et sont deux concepts différents. –

7

@OP, suivant, vous pouvez utiliser for loops pour capturer l'état de retour de votre programme, si elle émet autre chose que des chiffres

51

En complément this previous answer, les tuyaux peuvent être utilisés à l'intérieur d'une pour déclaration, échappé par un caret:

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

Deux points importants: Utilisez des jetons pour capturer et prendre soin d'échapper au tuyau. –

+0

Version équivalente qui fonctionne sur la CLI et qui peut être copiée-collée pour faciliter le bricolage: 'pour/f" tokens = * "% i dans ('tasklist^| findstr explorer') fait @echo% i' Mais en général, le 'usebackq' devrait être utilisé pour gérer les commandes complexes. –

1

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

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

Référence: Redirect output of command in for loop of batch script

0
@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 
2

sur l'exécution: for /f %%i in ('application arg0 arg1') do set VAR=%%i je recevais l'erreur: %% i était inattendue à ce moment. En tant que correctif, j'ai dû exécuter ci-dessus comme for /f %i in ('application arg0 arg1') do set VAR=%i

+1

Dans un fichier batch, vous avez besoin de '%%' et en dehors d'un fichier batch sur une ligne de commande, vous avez besoin de '%' –

Questions connexes