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


110

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

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

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

답변:


161

파일 포인터를 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.

2
파일의 나머지 부분에 대해 설정할 수있는 솔루션이 마음
Sam

3
점을 유의 통화 솔루션이 변경 % 0을 (를 하위 또는 당신이 원하는하지 않을 수있다이 경우).
Jannes 2016

1
@Jannes-사실이지만 수정자를 추가하면 실행중인 배치 스크립트에 대한 정보를 항상 얻을 수 있습니다. 예를 들어, %~f0CALLed : subroutine 내부에있는 경우에도 항상 배치 스크립트의 전체 경로를 제공합니다.
dbenham

3
@ThariqNugrohotomo ->output.txt 2>&1
dbenham

2
@Moondra-동일한 스크립트 내에서 레이블이 지정된 서브 루틴을 호출하기위한 표준 배치 구문입니다. 설명서를 보려면 콘솔 명령 줄에서 cmd /?또는 실행 help cmd하십시오. 세 번째 방법의 트릭은 CALL에 대한 리디렉션이 CALLed 서브 루틴 내의 모든 명령에 적용된다는 것입니다.
dbenham


16

나는 이것이 오래된 게시물이라는 것을 알고 있지만 누군가가 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

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


감사합니다. 빠른 질문에 .log와 .txt를 사용하는 이유가 있습니까? 그게 차이를 만들까요?
Moondra

1
@Moondra 아니에요. 이 경우 의미론 일뿐입니다. 그것은 파일 유형에 따라 / grep을 요구하는 응용 프로그램이 없다는 것을 말하는 것이 아니므로 파일이 사용되는지 여부와 방법을 알고 있어야합니다.
Anthony

9
echo some output >"your logfile"

또는

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

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

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


9
@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

이것이 가장 우아한 방법이라고 생각합니다. 감사합니다 Wesley!
Kiswanij

5

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

some_command  ^|  TEE.BAT  [ -a ]  filename 


4

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

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

이것은 나를 위해 일했습니다. 감사합니다. 이것이 실패 할 수있는 특별한 고려 사항이 있습니까? (예 : 출력 크기 오버플로)
CCarlos

안녕하세요, 답변 해 주셔서 감사합니다! 콘솔에서도 리디렉션하는 방법이 있습니까?
Sandeep Singh

3
@echo OFF
[your command] >> [Your log file name].txt

위의 명령을 배치 파일에서 사용했는데 작동합니다. 로그 파일에는 내 명령의 결과가 표시됩니다.


0

입력에 "독성"문자가있는 경우 실패 할 수 있습니다. thisIsAnIn ^^^^ put과 같은 입력을 고려하면 무슨 일이 일어나고 있는지 이해하는 좋은 방법입니다. 물론 입력 문자열이 반드시 큰 따옴표 안에 있어야한다는 규칙이 있지만 입력의 의미가 NTFS 파티션의 위치 인 경우에만이 규칙이 유효한 규칙이라는 느낌이 있습니다 (아마도 URL에 대한 규칙 일 수 있음). 확실하지 않음). 그러나 이것은 물론 임의의 입력 문자열에 대한 규칙이 아닙니다 ( "좋은 방법"이지만 셀 수는 없습니다).


0

배치 파일의 맨 아래에 다음 행을 추가하면 CMD 창에 표시된대로 모든 것을 가져와 텍스트 파일로 내 보냅니다.

powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^a')
powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^c')
powershell Get-Clipboard > MyLog.txt

기본적으로 모두 선택 -> 클립 보드에 복사 -> 텍스트 파일에 붙여 넣기를 수행합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.