배치 파일 내의 출력 리다이렉트
시스템에서 정보를 수집하기 위한 간단한 명령어를 사용하여 배치 파일을 만듭니다.배치 파일에는 시간, 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
'programing' 카테고리의 다른 글
| NSString 값을 NSData로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
|---|---|
| SQL Server IN과 기존 성능 비교 (0) | 2023.04.10 |
| PowerShell에서 출력하는 방법 (0) | 2023.04.10 |
| Excel VBA 비밀번호 해시 함수 (0) | 2023.04.10 |
| 네비게이션 바의 "뒤로" 버튼의 제목을 변경하려면 어떻게 해야 합니까? (0) | 2023.04.10 |