web-dev-qa-db-fra.com

Comment définir les commandes en sortie sous forme de variable dans un fichier de commandes

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

findstr testing > %VARIABLE%

echo %VARIABLE%
182
Dennis
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 puissiez utiliser vos guillemets sans foirer 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
228
Mechaflash

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 par exemple:

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

Crédit au fil sur le matériel de Tom.

57
dolphy

en une seule ligne:

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

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

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

30
Yuri

Pour lire un fichier ...

set /P Variable=<File.txt

Écrire un fichier

@echo %DataToWrite%>File.txt

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

Pour ajouter à un fichier, comme un programme de journalisation, commencez par créer un fichier avec une seule touche d'entrée, appelé 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

En tout cas quelques choses utiles

18
MaxMinecraft101e

Ces réponses étaient si proches de la réponse dont j'avais besoin. Ceci est une tentative pour développer sur eux.

Dans un fichier batch

Si vous exécutez à partir d'un fichier .bat et que vous voulez une seule ligne vous permettant d'exporter une commande compliquée telle que jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json vers une variable nommée AWS_ACCESS_KEY, vous 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'invite C:\, vous souhaitez une seule ligne vous permettant d'exécuter une commande compliquée telle que jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json vers une variable nommée AWS_ACCESS_KEY alors vous souhaitez 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 les signes de pourcentage (%%).

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

5
Ryan Shillington
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
2
Dado