Przypisanie wyjścia programu do zmiennej

Muszę przypisać wyjście programu do zmiennej za pomocą pliku wsadowego MS.

Więc w powłoce GNU Bash użyłbym VAR=$(application arg0 arg1). Potrzebuję podobnego zachowania w systemie Windows przy użyciu pliku wsadowego.

Coś w stylu set VAR=application arg0 arg1.

Author: lospejos, 2010-02-24

8 answers

Jedna droga to:

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

Inny to:

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

Zauważ, że pierwszy % w %%i jest używany do ucieczki % po nim i jest potrzebny podczas używania powyższego kodu w pliku wsadowym, a nie w linii poleceń. Wyobraź sobie, twój test.bat ma coś takiego:

for /f %%i in ('c:\cygwin64\bin\date.exe +"%%Y%%m%%d%%H%%M%%S"') do set datetime=%%i
echo %datetime%
 328
Author: Carlos Gutiérrez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 13:12:17

Jako dodatek do tej poprzedniej odpowiedzi, można użyć wewnątrz wyrażenia for, którego symbolem jest:

    for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i
 55
Author: Renat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59

@OP, możesz użyć dla pętli , aby uchwycić status powrotu Twojego programu, jeśli wyświetli coś innego niż liczby

 8
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-24 02:47:30

Zakładając, że wyjście aplikacji jest numerycznym kodem zwrotnym, możesz wykonać następujące czynności

application arg0 arg1
set VAR=%errorlevel%
 7
Author: akf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-24 02:37:34

Podczas wykonywania: for /f %%i in ('application arg0 arg1') do set VAR=%%i otrzymałem błąd: % % byłem nieoczekiwany w tym czasie. Jako fix, musiałem wykonać powyżej jako for /f %i in ('application arg0 arg1') do set VAR=%i

 3
Author: Munish Mehta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 11:14:52

Oprócz odpowiedzi, nie można bezpośrednio używać operatorów przekierowań wyjściowych w set część pętli for (np. jeśli chcesz ukryć wyjście stderror przed użytkownikiem i dostarczyć ładniejszy komunikat o błędzie). Zamiast tego musisz uciec od nich z postacią karetki (^):

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

Reference: Redirect output of command in for loop of batch script

 1
Author: Kubo2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24
@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
 0
Author: rcm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 13:39:41

Napisałem skrypt, który pingi google.com co 5 sekund i rejestrowanie wyników z aktualnym czasem. Tutaj można znaleźć wyjście do zmiennych "commandLineStr" (z indeksami)

@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
 0
Author: Ja Vy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 12:25:09