답변:
한 가지 방법은 다음과 같습니다.
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 /f "tokens=3" %%i in ('route print ^| findstr "\<0.0.0.0\>"') do set "myVar=%%i"
이 이전 답변 외에도 파이프는 캐럿 기호로 이스케이프 된 for 문 내부에서 사용할 수 있습니다.
for /f "tokens=*" %%i in ('tasklist ^| grep "explorer"') do set VAR=%%i
for /f "tokens=*" %i in ('tasklist ^| findstr explorer') do @echo %i
그러나 일반적으로 usebackq
복잡한 명령을 처리하는 데 사용해야합니다.
for /f "tokens=*" %%i in ('"tasklist | grep explorer"') do set VAR=%%i
합니다. 명령 자체에 따옴표가 없으면 더 쉬워집니다.
응용 프로그램의 출력이 숫자 리턴 코드라고 가정하면 다음을 수행 할 수 있습니다.
application arg0 arg1
set VAR=%errorlevel%
실행 중 : for /f %%i in ('application arg0 arg1') do set VAR=%%i
오류가 발생했습니다. 현재 %% i이 (가) 예기치 않았습니다. 수정으로, 나는 위와 같이 실행해야했다.for /f %i in ('application arg0 arg1') do set VAR=%i
%%
하고 명령 줄에서 배치 파일 외부%
답변 외에도 루프 의 설정 부분 에서 출력 리디렉션 연산자를 직접 사용할 수 없습니다 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
bash 쉘의 동작과 약간 유사한 명령 출력의 간단한 캡처를 위해 배치 매크로를 사용할 수 있습니다.
매크로 사용법은 간단하며 다음과 같습니다.
%$set% VAR=application arg1 arg2
파이프와도 작동합니다.
%$set% allDrives="wmic logicaldisk get name /value | findstr "Name""
매크로는 변수를 배열처럼 사용하고 각 행을 별도의 인덱스에 저장합니다.
샘플 %$set% allDrives="wmic logicaldisk
에는 다음과 같은 변수가 생성됩니다.
allDrives.Len=5
allDrives.Max=4
allDrives[0]=Name=C:
allDrives[1]=Name=D:
allDrives[2]=Name=F:
allDrives[3]=Name=G:
allDrives[4]=Name=Z:
allDrives=<contains the complete text with line feeds>
그것을 사용하기 위해 매크로 자체가 어떻게 작동하는지 이해하는 것은 중요하지 않습니다.
전체 예
@echo off
setlocal
call :initMacro
%$set% ipOutput="ipconfig"
call :ShowVariable ipOutput
echo First line is %ipOutput[0]%
echo(
%$set% driveNames="wmic logicaldisk get name /value | findstr "Name""
call :ShowVariable driveNames
exit /b
:ShowVariable
setlocal EnableDelayedExpansion
for /L %%n in (0 1 !%~1.max!) do (
echo %%n: !%~1[%%n]!
)
echo(
exit /b
:initMacro
if "!!"=="" (
echo ERROR: Delayed Expansion must be disabled while defining macros
(goto) 2>nul
(goto) 2>nul
)
(set LF=^
%=empty=%
)
(set \n=^^^
%=empty=%
)
set $set=FOR /L %%N in (1 1 2) dO IF %%N==2 ( %\n%
setlocal EnableDelayedExpansion %\n%
for /f "tokens=1,* delims== " %%1 in ("!argv!") do ( %\n%
endlocal %\n%
endlocal %\n%
set "%%~1.Len=0" %\n%
set "%%~1=" %\n%
if "!!"=="" ( %\n%
%= Used if delayed expansion is enabled =% %\n%
setlocal DisableDelayedExpansion %\n%
for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n%
if "!!" NEQ "" ( %\n%
endlocal %\n%
) %\n%
setlocal DisableDelayedExpansion %\n%
set "line=%%O" %\n%
setlocal EnableDelayedExpansion %\n%
set pathExt=: %\n%
set path=; %\n%
set "line=!line:^=^^!" %\n%
set "line=!line:"=q"^""!" %\n%
call set "line=%%line:^!=q""^!%%" %\n%
set "line=!line:q""=^!" %\n%
set "line="!line:*:=!"" %\n%
for /F %%C in ("!%%~1.Len!") do ( %\n%
FOR /F "delims=" %%L in ("!line!") Do ( %\n%
endlocal %\n%
endlocal %\n%
set "%%~1[%%C]=%%~L" ! %\n%
if %%C == 0 ( %\n%
set "%%~1=%%~L" ! %\n%
) ELSE ( %\n%
set "%%~1=!%%~1!!LF!%%~L" ! %\n%
) %\n%
) %\n%
set /a %%~1.Len+=1 %\n%
) %\n%
) %\n%
) ELSE ( %\n%
%= Used if delayed expansion is disabled =% %\n%
for /F "delims=" %%O in ('"%%~2 | findstr /N ^^"') do ( %\n%
setlocal DisableDelayedExpansion %\n%
set "line=%%O" %\n%
setlocal EnableDelayedExpansion %\n%
set "line="!line:*:=!"" %\n%
for /F %%C in ("!%%~1.Len!") DO ( %\n%
FOR /F "delims=" %%L in ("!line!") DO ( %\n%
endlocal %\n%
endlocal %\n%
set "%%~1[%%C]=%%~L" %\n%
) %\n%
set /a %%~1.Len+=1 %\n%
) %\n%
) %\n%
) %\n%
set /a %%~1.Max=%%~1.Len-1 %\n%
) %\n%
) else setlocal DisableDelayedExpansion^&set argv=
goto :eof
5 초마다 google.com을 핑하고 현재 시간으로 결과를 기록하는 스크립트를 작성했습니다. 여기에서 변수 "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