[windows] 배치 파일 내에서 출력 리디렉션

시스템에서 정보를 수집하는 몇 가지 간단한 명령으로 배치 파일을 만들고 있습니다. 배치 파일에는 시간, IP 정보, 사용자 등을 가져 오는 명령이 포함되어 있습니다.

모든 명령을 배치 파일에 모아서 실행하지만 배치 파일을 실행하여 결과를 텍스트 파일 (로그)로 출력하고 싶습니다. 그렇게하는 배치에 추가 할 수있는 명령이 있습니까?

cmd에서 일괄 처리를 실행하지 않고 출력을 리디렉션하고 싶지 않습니다. 가능한 경우 배치 내부에서 출력을 리디렉션하고 싶습니다.



답변

파일 포인터를 End-Of-File에 여러 번 열고 배치하기 때문에 느린 단순 순진한 방법입니다.

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

더 나은 방법-파일이 한 번만 열리고 위치가 지정되므로 쓰기가 쉽고 빠릅니다.

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

파일을 한 번만 열고 배치하는 또 다른 좋고 빠른 방법

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN

2020-04-17 수정

가끔씩 두 개 이상의 파일에 반복적으로 쓸 수 있습니다. 화면에 다른 메시지를 표시 할 수도 있습니다. 괄호로 묶인 블록 또는 서브 루틴 외부의 정의되지 않은 핸들로 리디렉션 한 다음이 &표기법을 사용하여 이미 열린 파일을 참조 하여이 작업을 효율적으로 수행 할 수 있습니다.

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b

동일한 명령에서 여러 리디렉션을 수행 할 때 Microsoft 리디렉션 구현 설계 결함 으로 인해 잠재적 인 영구적 리디렉션을 피할 가능성이 더 높기 때문에 핸들 9와 8을 역순으로 사용하기로 선택했습니다 . 그럴 가능성은 거의 없지만 충분히 노력하면 그러한 접근 방식에서도 버그가 노출 될 수 있습니다. 리디렉션을 준비하면 문제를 피할 수 있습니다.

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.


답변

out 및 err 스트림을 모두 리디렉션하려면

dir >> a.txt 2>&1


답변

나는 이것이 오래된 게시물이라는 것을 알고 있지만 누군가가 Google 검색에서 그것을 우연히 발견 할 것이고 또한 OP가 코멘트에서 요청한 몇 가지 질문이 구체적으로 해결되지 않은 것처럼 보입니다. 또한 이것이 저의 첫 번째 답변이므로 저에게 쉽게 가십시오. 🙂

동적으로 생성 된 파일 이름을 사용하여 출력을 파일로 리디렉션하기 위해 이동 (읽기 : 퀵 앤 더티) 접근 방식은 @dbenham에서 제공하는 두 번째 솔루션입니다. 예를 들면 다음과 같습니다.

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

대상 디렉터리에있는 파일 의이 스크린 샷 에서 볼 수있는 것과 같은 파일을 생성합니다.

여기에는 다음 출력이 포함됩니다.

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

또한이 솔루션은 로케일에 따라 다르므로 사용 방법 /시기에주의하십시오.


답변

echo some output >"your logfile"

또는

(
 echo some output
 echo more output
)>"Your logfile"

청구서를 작성해야합니다.

당신이 원하는 경우 APPEND출력, 사용 >>대신에 >. >새 로그 파일을 시작합니다.


답변

@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name"
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address"

ipconfig | find "IPv4"
ipconfig | find "Default Gateway"

)

@pause


답변

출력을 파일과 콘솔로 리디렉션하는 데 사용할 수있는 멋진 작은 프로그램이 있습니다.

some_command  ^|  TEE.BAT  [ -a ]  filename


답변

배치 파일 상단 근처에 다음 두 줄을 추가하면 모든 stdout 및 stderr이 log.txt로 리디렉션됩니다.

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1