Присвоить результат работы программы в переменной


мне нужно присвоить результат работы программы в переменной, используя пакетный файл МС.

поэтому в GNU bash shell я бы использовал VAR=$(application arg0 arg1). Мне нужно подобное поведение в Windows с помощью пакетного файла.

что-то вроде set VAR=application arg0 arg1.

8 217

8 ответов:

один из способов-это:

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

другое:

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

обратите внимание, что первый % на %%i используется, чтобы избежать % после него и требуется при использовании вышеуказанного кода в пакетном файле, а не в командной строке. Представьте себе, ваш test.bat есть что-то типа:

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

как дополнение к этот предыдущий ответ, трубы могут использоваться внутри оператора for, экранированного символом каретки:

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

@OP, вы можете использовать циклы чтобы захватить статус возврата вашей программы, если она выводит что-то другое, чем числа

предполагая, что вывод вашего приложения является числовым кодом возврата, вы можете сделать следующее

application arg0 arg1
set VAR=%errorlevel%

При Выполнении: for /f %%i in ('application arg0 arg1') do set VAR=%%i Я получал ошибку: %%я был неожиданным в это время. В качестве исправления, я должен был выполнить выше как for /f %i in ('application arg0 arg1') do set VAR=%i

В дополнение к ответу, вы не можете напрямую использовать операторы перенаправления вывода в set часть for цикл (например, если вы хотите скрыть вывод stderror от пользователя и предоставить более приятное сообщение об ошибке). Вместо этого вы должны избежать их с помощью символа каретки (^):

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

ссылки: перенаправить вывод команды в цикл пакетного скрипта

@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

Я написал сценарий, который пингует google.com каждые 5 секунд и результаты регистрации с текущим временем. Здесь вы можете найти выходные данные для переменных "commandLineStr" (с индексами)

@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