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%
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%
Réponses:
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
ENABLEDELAYEDEXPANSION
|
auquel cas cela ne fonctionne pas.
command
toute 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 do
bloc). Donc, je suppose qu'une partie de cette for
construction la remplace. BTW Il est incroyable de voir à quel point un code fou est nécessaire pour quelque chose d'aussi élémentaire.
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.
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
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
Ces réponses étaient toutes si proches de la réponse dont j'avais besoin. C'est une tentative de les développer.
Si vous exécutez à partir d'un .bat
fichier 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.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")
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.json
une variable nommée, AWS_ACCESS_KEY
alors vous voulez ceci:
FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")
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 USEBACKQ
ligne 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.
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
, tokens
ou usebackq
en for
boucle.
Testé sur Win 10 CMD.
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
appcmd
n'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
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.
pipe the command into a variable prompt
vous 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!
J'espère que cette aide
set a=%username%
echo %a%
set a="hello"
echo %a%