배치 파일의 명령문 출력을 변수로 설정할 수 있습니까? 예를 들면 다음과 같습니다.
findstr testing > %VARIABLE%
echo %VARIABLE%
배치 파일의 명령문 출력을 변수로 설정할 수 있습니까? 예를 들면 다음과 같습니다.
findstr testing > %VARIABLE%
echo %VARIABLE%
답변:
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
ENABLEDELAYEDEXPANSION
|
하지 않는 경우 를 사용해야 하는 경우 를 제외하고 는 잘 작동합니다.
command
어쨌든 종료 코드를 캡처 할 수 있습니까? 0이 아닌 코드를 반환하지만 블록 %ERRORLEVEL%
을 사용하려는 위치와 상관없이 항상 0을 포함 하고 있다고 확신합니다 do
. 그래서 그 for
구성 의 일부 가 덮어 쓰는 것 같습니다. BTW 초보적인 무언가에 미친 듯이 보이는 코드가 얼마나 필요한지 믿기지 않습니다.
나는 거기에 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의 스레드에 대한 크레딧입니다.
한 줄로 :
FOR /F "tokens=*" %g IN ('*your command*') do (SET VAR=%g)
명령 출력은 % g로 설정되고 VAR로 설정됩니다.
자세한 정보 : https://ss64.com/nt/for_cmd.html
파일을 읽으려면 ...
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
등등
어쨌든 몇 가지 유용한 것들
이 답변은 모두 내가 필요한 답변에 너무 가깝습니다. 이것은 그들을 확장하려는 시도입니다.
.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
되므로 백 따옴표를 사용하여 실행할 명령을 지정하고 그 안에 모든 종류의 재미있는 문자를 지정할 수 있도록 옵션에 행 을 포함해야 합니다.
임시 파일로 출력하지 않고 변수를 읽으려면 명령의 결과를 변수에 직접 저장합니다.
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에서 테스트되었습니다.
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
표준 프로그램이 아니며 변수에 프로그램 출력을 할당하는 위치를 볼 수 없습니다. 마지막으로 더 많은 설명이 필요합니다
나는 이것을 이렇게 테스트했고 효과가 있었다.
SET /P Var= | Cmd
명령을 변수에 파이핑하면 프롬프트 " Cmd
"가 변수 " Var
"에 삽입됩니다.
최신 정보:
작동하지 않습니다, 내 나쁜, 내가 한 스크립트는 다음과 같습니다.
SET /P Var= | dir /b *.txt
echo %Var%
실제로 " test.txt
" 라고 표시 했지만 실제로 " dir /b *.txt
"가 아닌 " "명령 의 결과를 표시 했습니다 echo %var%
. 두 출력이 동일하기 때문에 혼란스러워했습니다.
pipe the command into a variable prompt
작성해야 dir /b *.txt | SET /P Var=
합니다. 추신 : 그것은 그렇게 작동하지 않습니다!