(DOS 배치 프로그램 작성) 표준출력(stdout)과 동시에 파일에 출력하기

DOS배치파일 작성 팁

다음 Unix의 tee명령 처럼 “표준 출력(stdout)“을 입력으로 받아서 “표준 출력(stdout) + 파일 출력“으로 변경하는 Windows용 DOS배치 프로그램을 소개합니다.

UNIX 예

linux 7 이전

$ ifconfig | tee -a sample.log

linux 8 이후

$ ip addr show | tee -a sample.log

실행 결과는 다음과 같이 화면에도 표시되고 파일로도 출력됩니다.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:c6:11:d6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.23/24 brd 192.168.12.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec6:11d6/64 scope link
       valid_lft forever preferred_lft forever
$ ls -la sample.log
-rw-r--r--. 1 adm01 wheel 684 12月  3 19:58 sample.log

DOS 예

Windows에는 표준출력(stdout)과 동시에 파일에 출력해주는 DOS명령이 없습니다. 대신 DOS배치 스크립트로 대체 할 수는 있습니다. 이 글에서는 tee.bat배치 프로그램을 만들어서 tee기능을 재연 해 보겠습니다.

다음은 ipconfig명령를 실행하여 출력된 결과를 1행 단위로 변수 %A에 대입하여 변수 %A값을 echo명령으로 sample.log에 파일 출력과 표준출력(stdout)으로 다시 보내는 DOS배치 스크립트 예 입니다. for문의 대입 변수를 나타내는 단일 퍼센트 기호 (%)와 리터럴 문자로 사용하는 단일 퍼센트 기호 (%) 는 인수(파라메터) 또는 환경변수로 잘못 해석 되지 않도록 Escape Code (%)를 앞에 붙여서 %%로 사용합니다. 배치 프로그램에서 인수로 해석되는 %1, %2, %3 그리고 환경변수로 해석되는 %PARAM1% 에는 Escape Code (%)를 붙이지 않습니다. 주의) 명령 프롬프트 창에서 IF문을 직접 실행할 때는 %%A 대신 %A를 사용합니다.

D:\> type tee.bat
@echo off
set  /p PARAM1=
IF "%1" equ "-a" (
   IF "%2" neq "" (
      type nul > %2
      for /f "usebackq tokens=*" %%A in (`%PARAM1%`) do (
           echo %%A >> %2
           echo %%A 
      )
   )
) 

실행 결과는 다음과 같습니다. unix의 tee의 사용법과 비슷한 결과를 얻을 수 있습니다 만 비어 있는 행을 출력할 수 없다는 점과 echo를 사용하여 명령을 문자로 건네 주어야 한다는 점을 빼고는 괜찮다고 보여집니다.

D:\> echo ipconfig | tee -a sample.log
Windows IP Configuration
Ethernet adapter Ethernet0:
Connection-specific DNS Suffix  . : localdomain
Link-local IPv6 Address . . . . . : fe80::503b:d331:92f8:b38d%10
IPv4 Address. . . . . . . . . . . : 192.168.220.128
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.220.2
D:\> dir
2021-12-05  12:26    337 sample.log

한가지 문제가 있다면 echo 결과를 명령이 아닌 문자로서 취급하여 파일과 출력할 수 없다는 것입니다.

비어 있는 행을 출력하고자 한다면 다음과 같이 선두에 행 번호를 부여해서 출력하는 방법이 있습니다.

D:\> type tee.bat 
@echo off
set  /p PARAM1=
IF "%1" equ "-a" (
   IF "%2" neq "" (
      type nul > %2
      for /f "usebackq  tokens=*" %%A in (`%PARAM1% ^| findstr /N "^"`) do (
           echo %%A >> %2
           echo %%A 
      )
   )
) 
D:\> echo ipconfig | tee -a sample.log
1:
2:Windows IP Configuration
3:
4:
5:Ethernet adapter Ethernet0:
6:
7:   Connection-specific DNS Suffix  . : localdomain
8:   Link-local IPv6 Address . . . . . : fe80::503b:d331:92f8:b38d%10
9:   IPv4 Address. . . . . . . . . . . : 192.168.220.128
10:   Subnet Mask . . . . . . . . . . . : 255.255.255.0
11:   Default Gateway . . . . . . . . . : 192.168.220.2
D:\> dir
2021-12-05  14:26    383 sample.log
제목과 URL을 복사했습니다