programing

배치 파일 내의 출력 리다이렉트

fastcode 2023. 4. 10. 22:20
반응형

배치 파일 내의 출력 리다이렉트

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

모든 명령어를 일괄 파일로 정리하여 실행했지만 실행 시 텍스트 파일(로그)로 출력하기 위해 일괄 파일을 원합니다.그렇게 할 수 있는 명령어를 배치에 추가할 수 있습니까?

cmd에서 배지를 실행하고 나서 출력을 리다이렉트 하는 것을 잊지 말아 주세요.가능하다면 배치 내부에서 출력을 리다이렉트 하고 싶습니다.

파일 포인터를 여러 번 열어 파일 끝 부분에 배치하기 때문에 속도가 느립니다.

@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 echo File 1 message 1
>&8 echo File 2 message 1
echo Screen message 2
>&9 echo File 1 message 2
>&8 echo File 2 message 2
exit /b

핸들 9와 8을 역순으로 사용하는 것을 선택했습니다.그렇게 하면, 같은 커맨드로 복수의 리다이렉션을 실행할 때에, Microsoft 의 리다이렉션 실장 설계상의 결함으로 인해, 잠재적인 영속적인 리다이렉션을 회피할 가능성이 높아지기 때문입니다.가능성은 매우 낮지만, 그 접근법이라도 충분히 노력하면 버그가 노출될 수 있습니다.리다이렉션을 스테이징 하면 문제를 회피할 수 있습니다.

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

:sub
etc.

out 스트림과 err 스트림을 모두 리다이렉트 하는 경우

dir >> a.txt 2>&1

오래된 글이라는 것은 알지만, 구글 검색에서 우연히 발견될 것이고, OP가 댓글로 던진 질문도 특별히 다루지 않은 것 같습니다.그리고 SO에 처음 올라온 답변이니 봐주세요. :)

동적으로 생성된 파일명을 사용하여 출력을 파일로 리다이렉트 하려면 my go-to (읽기: 퀵&더티)접근법이 @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 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
echo some output >"your logfile"

또는

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

그 비용을 충당해야 합니다.

APPEND " " 를 사용합니다.>>>>새 로그 파일이 시작됩니다.

배치 파일의 맨 위에 이 두 줄을 추가하면 이후의 모든 stdout 및 stderr이 로그로 리디렉션됩니다.txt:

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

출력을 파일과 콘솔로 리다이렉트하기 위해 사용할 수 있는 작고 멋진 프로그램이 있습니다.

some_command  ^|  TEE.BAT  [ -a ]  filename 

@ECHO OFF
:: Check Windows version
IF NOT "%OS%"=="Windows_NT" GOTO Syntax

:: Keep variables local
SETLOCAL

:: Check command line arguments
SET Append=0
IF /I [%1]==[-a] (
	SET Append=1
	SHIFT
)
IF     [%1]==[] GOTO Syntax
IF NOT [%2]==[] GOTO Syntax

:: Test for invalid wildcards
SET Counter=0
FOR /F %%A IN ('DIR /A /B %1 2^>NUL') DO CALL :Count "%%~fA"
IF %Counter% GTR 1 (
	SET Counter=
	GOTO Syntax
)

:: A valid filename seems to have been specified
SET File=%1

:: Check if a directory with the specified name exists
DIR /AD %File% >NUL 2>NUL
IF NOT ERRORLEVEL 1 (
	SET File=
	GOTO Syntax
)

:: Specify /Y switch for Windows 2000 / XP COPY command
SET Y=
VER | FIND "Windows NT" > NUL
IF ERRORLEVEL 1 SET Y=/Y

:: Flush existing file or create new one if -a wasn't specified
IF %Append%==0 (COPY %Y% NUL %File% > NUL 2>&1)

:: Actual TEE
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
	>  CON    ECHO.%%B
	>> %File% ECHO.%%B
)

:: Done
ENDLOCAL
GOTO:EOF

:Count
SET /A Counter += 1
SET File=%1
GOTO:EOF

:Syntax
ECHO.
ECHO Tee.bat,  Version 2.11a for Windows NT 4 / 2000 / XP
ECHO Display text on screen and redirect it to a file simultaneously
ECHO.
IF NOT "%OS%"=="Windows_NT" ECHO Usage:  some_command  ³  TEE.BAT  [ -a ]  filename
IF NOT "%OS%"=="Windows_NT" GOTO Skip
ECHO Usage:  some_command  ^|  TEE.BAT  [ -a ]  filename
:Skip
ECHO.
ECHO Where:  "some_command" is the command whose output should be redirected
ECHO         "filename"     is the file the output should be redirected to
ECHO         -a             appends the output of the command to the file,
ECHO                        rather than overwriting the file
ECHO.
ECHO Written by Rob van der Woude
ECHO http://www.robvanderwoude.com
ECHO Modified by Kees Couprie
ECHO http://kees.couprie.org
ECHO and Andrew Cameron

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

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

배치 파일 하단에 다음 행을 추가하면 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

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

입력에 "독성" 문자가 있는 경우 실패할 수 있습니다.IsAn과 같은 입력을 고려한다면In^^^^put은 상황을 이해하는 좋은 방법입니다.입력 문자열은 반드시 이중 따옴표로 묶어야 한다는 규칙이 있지만, 이 규칙은 입력의 의미가 NTFS 파티션의 위치일 경우에만 유효한 규칙인 것 같습니다(잘 모르는 URL의 규칙일 수도 있습니다).그러나 이는 임의의 입력 문자열에 대한 규칙은 아닙니다('좋은 관행'이지만 함께 셀 수는 없습니다).

언급URL : https://stackoverflow.com/questions/20484151/redirecting-output-from-within-batch-file

반응형