Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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

Что делать, если я хотел, чтобы вывод находился в сетевой папке, но не поверх предыдущего файла. Я хотел бы, чтобы все в моей компании запустили пакетный файл и отправили свои выводы в общую сетевую папку, которую я могу просмотреть