[batch-file] MS 배치 파일을 사용하여 프로그램 출력을 변수에 할당

MS 배치 파일을 사용하여 프로그램 출력을 변수에 할당해야합니다.

GNU Bash 셸에서 사용할 것 VAR=$(application arg0 arg1)입니다. 배치 파일을 사용하는 Windows에서도 비슷한 동작이 필요합니다.

같은 것 set VAR=application arg0 arg1.



답변

한 가지 방법은 다음과 같습니다.

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, for 루프 를 사용 하여 숫자 이외의 것을 출력하는 경우 프로그램의 리턴 상태를 캡처 할 수 있습니다.


답변

응용 프로그램의 출력이 숫자 리턴 코드라고 가정하면 다음을 수행 할 수 있습니다.

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)

참조 : 배치 스크립트의 for 루프에서 명령 출력 리디렉션


답변

@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