Перенаправление вывода из пакетного файла
Я создаю командный файл с некоторыми простыми командами для сбора информации из системы. Пакетный файл содержит команды для получения времени, IP-информации, пользователей и т.д.
Я собрал все команды в командный файл, и он запускается, но я хотел бы, чтобы командный файл при запуске выводил результаты в текстовый файл (журнал). Есть ли команда, которую я могу добавить в пакет, чтобы сделать это?
Имейте в виду, я не хочу запускать пакет из cmd, а затем перенаправить вывод; Я хочу перенаправить вывод изнутри пакета, если это возможно.
Ответы
Ответ 1
Простой наивный способ, который медленен, потому что он открывает и помещает указатель файла в конец файла несколько раз.
@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
Ответ 2
если вы хотите перенаправить перенаправленные и исходящие потоки
dir >> a.txt 2>&1
Ответ 3
Я знаю, что это более старая должность, но кто-то наткнется на нее в поиске 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
Также имейте в виду, что это решение зависит от локали, поэтому будьте осторожны, как вы его используете.
Ответ 4
@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
Ответ 5
echo some output >"your logfile"
или
(
echo some output
echo more output
)>"Your logfile"
должен заполнить счет.
Если вы хотите APPEND
выводить, используйте >>
вместо >
. >
запустит новый файл журнала.
Ответ 6
Существует небольшая небольшая программа, которую вы можете использовать для перенаправления вывода в файл и консоль
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
Ответ 7
@echo OFF
[your command] >> [Your log file name].txt
Я использовал команду выше в моем командном файле, и она работает. В лог файле показаны результаты моей команды.
Ответ 8
Добавьте эти две строки вверху вашего пакетного файла, все stdout и stderr после будут перенаправлены в log.txt:
if not "%1"=="STDOUT_TO_FILE" %0 STDOUT_TO_FILE %* >log.txt 2>&1
shift /1
Ответ 9
Что делать, если я хотел, чтобы вывод находился в сетевой папке, но не поверх предыдущего файла. Я хотел бы, чтобы все в моей компании запустили пакетный файл и отправили свои выводы в общую сетевую папку, которую я могу просмотреть