Windows 배치 스크립트에서 변수로 명령 결과를 얻으려고합니다 ( bash 스크립트에 해당하는 bash 에서 명령 결과를 얻는 방법 참조 ). .bat 파일에서 작동하는 솔루션이 선호되지만 다른 일반적인 Windows 스크립팅 솔루션도 환영합니다.
답변
모든 명령 출력을 캡처해야하는 경우 다음과 같이 배치를 사용할 수 있습니다.
@ECHO OFF
IF NOT "%1"=="" GOTO ADDV
SET VAR=
FOR /F %%I IN ('DIR *.TXT /B /O:D') DO CALL %0 %%I
SET VAR
GOTO END
:ADDV
SET VAR=%VAR%!%1
:END
모든 출력 라인은 “!”로 구분 된 VAR에 저장됩니다.
@ 존 : 이것에 실용적인 용도가 있습니까? 스크립트 작업을 쉽게 수행 할 수있는 PowerShell 또는 다른 프로그래밍 언어 (Python, Perl, PHP, Ruby)를보아야한다고 생각합니다.
답변
겸손 에 대한 명령은 지난 몇 년 동안 몇 가지 흥미로운 기능을 축적하고있다 :
D:\> FOR /F "delims=" %i IN ('date /t') DO set today=%i
D:\> echo %today%
Sat 20/09/2008
"delims="
date 명령의 출력이 한 번에 흐트러 지도록 기본 공간 및 탭 구분 기호 를 겹쳐 씁니다.
여러 줄로 된 출력을 캡처하려면 여전히 기본적으로 하나의 라이너가 될 수 있습니다 (결과 변수에서 변수 lf를 구분 기호로 사용).
REM NB:in a batch file, need to use %%i not %i
setlocal EnableDelayedExpansion
SET lf=-
FOR /F "delims=" %%i IN ('dir \ /b') DO if ("!out!"=="") (set out=%%i) else (set out=!out!%lf%%%i)
ECHO %out%
파이프 표현식을 캡처하려면 ^|
다음을 사용하십시오 .
FOR /F "delims=" %%i IN ('svn info . ^| findstr "Root:"') DO set "URL=%%i"
답변
현재 디렉토리를 얻으려면 다음을 사용할 수 있습니다.
CD > tmpFile
SET /p myvar= < tmpFile
DEL tmpFile
echo test: %myvar%
임시 파일을 사용하고 있기 때문에 가장 예쁘지는 않지만 확실히 작동합니다! ‘CD’는 현재 디렉토리를 ‘tmpFile’에 놓고 ‘SET’은 tmpFile의 내용을로드합니다.
다음은 “배열”을 사용하는 여러 줄에 대한 솔루션입니다.
@echo off
rem ---------
rem Obtain line numbers from the file
rem ---------
rem This is the file that is being read: You can replace this with %1 for dynamic behaviour or replace it with some command like the first example i gave with the 'CD' command.
set _readfile=test.txt
for /f "usebackq tokens=2 delims=:" %%a in (`find /c /v "" %_readfile%`) do set _max=%%a
set /a _max+=1
set _i=0
set _filename=temp.dat
rem ---------
rem Make the list
rem ---------
:makeList
find /n /v "" %_readfile% >%_filename%
rem ---------
rem Read the list
rem ---------
:readList
if %_i%==%_max% goto printList
rem ---------
rem Read the lines into the array
rem ---------
for /f "usebackq delims=] tokens=2" %%a in (`findstr /r "\[%_i%]" %_filename%`) do set _data%_i%=%%a
set /a _i+=1
goto readList
:printList
del %_filename%
set _i=1
:printMore
if %_i%==%_max% goto finished
set _data%_i%
set /a _i+=1
goto printMore
:finished
그러나 더 강력한 다른 쉘로 옮기거나이 응용 프로그램을위한 응용 프로그램을 만드는 것이 좋습니다. 배치 파일의 가능성을 상당히 늘리고 있습니다.
답변
SET
매개 변수 /P
와 함께 명령 을 사용하고 출력을 지시해야합니다. 예를 들어 http://www.ss64.com/nt/set.html을 참조 하십시오 . .BAT 파일에 대해 확실하지 않은 CMD에서 작동합니다.
의견에서이 게시물로 :
이 링크에는 ”
Set /P
” 명령 이 있으며이 명령 은
_MyVar=<MyFilename.txt_MyVar
에서 첫 번째 줄로 설정 됩니다MyFilename.txt
. ”myCmd > tmp.txt
“with ”set
” 로 사용할 수 있습니다 . 그러나 모든 출력이 아니라 출력의 첫 번째 줄만 가져옵니다.
/P myVar=<tmp.txt
답변
“V”환경 변수에서 가장 최근 파일을 설정하는 예
FOR /F %I IN ('DIR *.* /O:D /B') DO SET V=%I
배치 파일에서 루프 변수에 이중 접두사를 사용해야합니다.
FOR /F %%I IN ('DIR *.* /O:D /B') DO SET V=%%I
답변
FOR
명령 의 결과 만 사용하십시오 . 예를 들어 (배치 파일 내부) :
for /F "delims=" %%I in ('dir /b /a-d /od FILESA*') do (echo %%I)
%%I
원하는 값으로 사용할 수 있습니다 . 이것처럼 : %%I
.
그리고 사전에는 %%I
공백이나 CR 문자가 없으며 비교에 사용할 수 있습니다!
답변
bash에서 명령 결과를 인수로 사용에 제공된 솔루션을 찾고 있습니까?
다음 코드는 다음과 같습니다
@echo off
if not "%1"=="" goto get_basename_pwd
for /f "delims=X" %%i in ('cd') do call %0 %%i
for /f "delims=X" %%i in ('dir /o:d /b') do echo %%i>>%filename%.txt
goto end
:get_basename_pwd
set filename=%~n1
:end
- 이것은 pwd와 동일한 CD 명령의 결과로 자체적으로 호출됩니다.
- 매개 변수에서 문자열을 추출하면 파일 이름 / 폴더가 반환됩니다.
- 이 폴더의 내용을 가져 와서 filename.txt에 추가하십시오
[크레딧] : Windows XP 명령 페이지 의 다른 모든 답변과 일부 파기 덕분 입니다.