it-swarm.com.ru

Перенаправление вывода из пакетного файла

Я создаю командный файл с некоторыми простыми командами для сбора информации из системы. Пакетный файл содержит команды для получения времени, IP-информации, пользователей и т.д.

Я собрал все команды в командный файл, и он запускается, но я хотел бы, чтобы командный файл при запуске выводил результаты в текстовый файл (журнал). Есть ли команда, которую я могу добавить в пакет, чтобы сделать это?

Имейте в виду, я не хочу запускать пакет из cmd, а затем перенаправить вывод; Я хочу перенаправить вывод изнутри пакета, если это возможно.

90
user3085030

Простой наивный способ, который медленен, потому что он открывает и помещает указатель файла в конец файла несколько раз.

@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
134
dbenham

если вы хотите, чтобы и потоки ошибок и перенаправлены

dir >> a.txt 2>&1
53
Kalpesh Soni

Я знаю, что это старый пост, но кто-то наткнется на него в поиске Google, и похоже, что некоторые вопросы, заданные ОП в комментариях, не были специально рассмотрены. Также, пожалуйста, будьте осторожны со мной, так как это мой первый ответ, размещенный на SO :)

Чтобы перенаправить вывод в файл, используя динамически генерируемое имя файла, мой подход к переходу (читай: быстро и грязно) - это второе решение, предлагаемое @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

Также имейте в виду, что это решение зависит от локали, поэтому будьте осторожны с тем, как/когда вы его используете.

15
Anthony
@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
9
saif
echo some output >"your logfile"

или же

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

должен заполнить счет.

Если вы хотите APPEND вывод, используйте >> вместо >. > запустит новый лог-файл.

8
Magoo

Есть небольшая классная программа, которую вы можете использовать, чтобы перенаправить вывод в файл и консоль.

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
4
AquaAlex
@echo OFF
[your command] >> [Your log file name].txt

Я использовал команду выше в моем командном файле, и она работает. В лог-файле показаны результаты моей команды.

2
Indra Permana

Добавьте эти две строки вверху вашего пакетного файла, все stdout и stderr после будут перенаправлены в log.txt:

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