배치 파일에서 명령 출력을 변수로 설정하는 방법


242

배치 파일의 명령문 출력을 변수로 설정할 수 있습니까? 예를 들면 다음과 같습니다.

findstr testing > %VARIABLE%

echo %VARIABLE%





답변:


275
FOR /F "tokens=* USEBACKQ" %%F IN (`command`) DO (
SET var=%%F
)
ECHO %var%

삽입 할 문자열이나 긴 파일 이름이있는 경우 명령을 망치지 않고 큰 따옴표를 사용할 수 있도록 항상 USEBACKQ를 사용합니다.

이제 출력에 여러 줄이 포함되면이 작업을 수행 할 수 있습니다

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

3
Win7 시스템에서 저를 위해 일했습니다. 감사합니다! PS는 명령에서 %를 %%로 확장하는 것을 잊지 마십시오!
Dmitry Ilukhin

출력에 느낌표 (!)가 포함되어 있지 않으면 사용하면 제어 문자로 해석 ENABLEDELAYEDEXPANSION
JonathanDavidArndt

작동 |하지 않는 경우 를 사용해야 하는 경우 를 제외하고 는 잘 작동합니다.
매트 부코 마노 비치

6
@MattVukomanovic이 사용하는 나를 위해 작동 ^|대신에 |설명 된 바와 같이, 여기
AST

command어쨌든 종료 코드를 캡처 할 수 있습니까? 0이 아닌 코드를 반환하지만 블록 %ERRORLEVEL%을 사용하려는 위치와 상관없이 항상 0을 포함 하고 있다고 확신합니다 do. 그래서 그 for구성 의 일부 가 덮어 쓰는 것 같습니다. BTW 초보적인 무언가에 미친 듯이 보이는 코드가 얼마나 필요한지 믿기지 않습니다.
David Ferenczy Rogožan

69

나는 거기에 Interweb 일 이 스레드 를 발견 했습니다 . 아래로 비등합니다 :

@echo off 
setlocal enableextensions 
for /f "tokens=*" %%a in ( 
'VER' 
) do ( 
set myvar=%%a 
) 
echo/%%myvar%%=%myvar% 
pause 
endlocal 

명령 출력을 임시 파일로 리디렉션 한 다음 해당 임시 파일의 내용을 변수 등의 변수에 넣을 수도 있습니다. 여러 줄 입력에서는 작동하지 않습니다.

cmd > tmpFile 
set /p myvar= < tmpFile 
del tmpFile 

Tom 's Hardware의 스레드에 대한 크레딧입니다.


3
최하위 접근 방식의 단점은 다른 모든 방법에서 바람직하지만 다중 라인 출력에서는 작동하지 않는다는 것입니다.
dgo

VER의 경우 다른 방법으로 갈 것입니다. / f "tokens = 2 delims = [,]"%% a in ( 'ver') 버전 %% a echo % version %
Hardoman

1
당신은 likesuchashereby에 대한 두 번째 결과이다 - imagebin.ca/v/4NPSlQFgifce
쉬 무엘 Kamensky

두 번째 예제는 chromedriver.exe의 버전과 버전 번호가 포함 된 텍스트 파일을 확인하는 배치 파일을 작성하는 데 크게 도움이되었습니다. 나는 오래된 DOS 공룡이며 set 명령의 스위치를 알지 못했습니다. 다른 물건은 나를 위해 과잉이었다.
Bill Hileman

47

한 줄로 :

FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)

명령 출력은 % g로 설정되고 VAR로 설정됩니다.

자세한 정보 : https://ss64.com/nt/for_cmd.html


19
내 배치가 "% g"로 실행되지 않았습니다. "%% g"로 실행되었습니다.
Santiago Villafuerte

5
+ Santiago Villafuerte : 예, 배치 파일에서 실행 중이지만 명령 줄에서 직접 실행하려는 경우 (예 : 배치 파일에 배치하기 전에 테스트하려면) 단일 %를 사용합니다.
브렌트 리튼 하우스

19

파일을 읽으려면 ...

set /P Variable=<File.txt

파일을 쓰려면

@echo %DataToWrite%>File.txt

노트; <> 문자 앞에 공백이 있으면 변수 끝에 공백이 추가됩니다.

로거 프로그램과 같은 파일에 추가하려면 먼저 e.txt라는 단일 Enter 키를 사용하여 파일을 만듭니다.

set /P Data=<log0.log
set /P Ekey=<e.txt
@echo %Data%%Ekey%%NewData%>log0.txt

당신의 로그는 다음과 같습니다

Entry1
Entry2 

등등

어쨌든 몇 가지 유용한 것들


답변 주셔서 감사합니다. BTW "set / P Variable = <File.txt"는 파일의 첫 줄만 읽습니다
Deepscorn

19

이 답변은 모두 내가 필요한 답변에 너무 가깝습니다. 이것은 그들을 확장하려는 시도입니다.

배치 파일에서

.bat파일 내에서 실행 중이고 jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json이름이 지정된 변수 와 같은 복잡한 명령을 내보낼 수있는 단일 행을 원할 경우 AWS_ACCESS_KEY다음을 원합니다.

FOR /F "tokens=* USEBACKQ" %%g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%%g")

명령 줄에서

C:\프롬프트 가 표시되면 jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json이름이 지정된 변수 와 같은 복잡한 명령을 실행할 수있는 단일 행 AWS_ACCESS_KEY이 필요합니다.

FOR /F "tokens=* USEBACKQ" %g IN (`jq -r ".Credentials.AccessKeyId" c:\temp\mfa-getCreds.json`) do (SET "AWS_ACCESS_KEY=%g")

설명

위의 두 답변 사이의 유일한 차이점은 명령 줄에서 변수에 단일 %를 사용한다는 것입니다. 배치 파일에서 백분율 기호 (%%)를 두 배로 늘려야합니다.

명령에는 콜론, 따옴표 및 괄호가 포함 USEBACKQ되므로 백 따옴표를 사용하여 실행할 명령을 지정하고 그 안에 모든 종류의 재미있는 문자를 지정할 수 있도록 옵션에 행 을 포함해야 합니다.


13

임시 파일로 출력하지 않고 변수를 읽으려면 명령의 결과를 변수에 직접 저장합니다.

FOR /F %i IN ('findstr testing') DO set VARIABLE=%i
echo %VARIABLE%

검색 문자열을 큰 따옴표로 묶으려면 다음을 수행하십시오.

FOR /F %i IN ('findstr "testing"') DO set VARIABLE=%i

이 코드를 배치 파일에 저장하려면 추가 % 기호를 추가하십시오.

FOR /F %%i IN ('findstr "testing"') DO set VARIABLE=%%i

디렉토리의 파일 수를 세고 변수에 저장하는 유용한 예 : (파이프 표시)

FOR /F %i IN ('dir /b /a-d "%cd%" ^| find /v /c "?"') DO set /a count=%i

대신 명령 괄호 안에 큰 따옴표 "또는 액센트`의 단일 인용 부호의 사용을합니다. 이것은 청소기에 대한 대안으로 delims, tokens또는 usebackq에서 for루프.

Win 10 CMD에서 테스트되었습니다.


1
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표준 프로그램이 아니며 변수에 프로그램 출력을 할당하는 위치를 볼 수 없습니다. 마지막으로 더 많은 설명이 필요합니다
jeb

-3

나는 이것을 이렇게 테스트했고 효과가 있었다.

SET /P Var= | Cmd

명령을 변수에 파이핑하면 프롬프트 " Cmd"가 변수 " Var"에 삽입됩니다.

최신 정보:

작동하지 않습니다, 내 나쁜, 내가 한 스크립트는 다음과 같습니다.

SET /P Var= | dir /b *.txt
echo %Var%

실제로 " test.txt" 라고 표시 했지만 실제로 " dir /b *.txt"가 아닌 " "명령 의 결과를 표시 했습니다 echo %var%. 두 출력이 동일하기 때문에 혼란스러워했습니다.


3
의도 한 경우 파이프 방향을 올바르게하기 위해 pipe the command into a variable prompt작성해야 dir /b *.txt | SET /P Var=합니다. 추신 : 그것은 그렇게 작동하지 않습니다!
Jesse Chisholm

-18

이 도움을 바랍니다

set a=%username%
echo %a%    
set a="hello"
echo %a%

5
아니, 이것은로 답하는 질문은 변수로 명령의 출력을 얻을하는 것입니다 응답하지 않습니다

가장 쉬운 방법은 파일에 쓰고 해당 파일에서 읽는 것입니다. findstr "test"test.txt> testoutput.txt set /pa=<testoutput.txt echo % a %
Ben2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.