Как записать вывод сценария, если он выполняется планировщиком задач?

98

Как мне получить вывод сценария, выполняемого с помощью планировщика задач Windows, при использовании Windows Server 2008?

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

Mechaflash
источник
2
Иногда это не работает, например, файл журнала не создается. Один из сценариев, который может привести к этому, - когда задача вообще не запускалась, потому что Windows ошибочно считает, что она все еще выполняется. Вы можете отследить это, заблокировав историю задач (вкладка истории в свойстве задачи - информация может
Дэниел

Ответы:

87

Попробуйте это в качестве командной строки в планировщике задач:

cmd /c yourscript.cmd > logall.txt
user2744787
источник
2
хорошо, оболочка не требуется, отлично работает, а также регистрирует вывод дочерних сценариев PowerShell, которые вызываются из bat / cmd, запускаемого планировщиком задач. Спасибо!
Jonesome Reinstate Monica
9
Дополнительно используйте, cmd /c "path with spaces/command.cmd > file.txt"если у вас есть пробелы. 2>&1От ответа Ивана также идет в кавычки.
Dinei
3
нужно использовать двойные кавычки, чтобы мой заработал: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo
1
Я знаю, что прошло 5 лет, но изменил это на общепринятый ответ, поскольку это минималистский способ выполнения задачи.
Mechaflash
Теперь при запуске задачи у меня появляется командное окно. Как этого избежать?
Крис
59

С помощью stderr (куда попадает большинство ошибок):

cmd /c yourscript.cmd > logall.txt 2>&1
Иван
источник
56

Чтобы дополнить ответ @ user2744787, вот снимок экрана, показывающий, как использовать cmdаргументы в запланированной задаче:

Вывод команды запланированной задачи в файл журнала

Программа / сценарий: cmd

Добавьте аргументы: /c run_with_default_port.bat > IMQuantWebServices.log

Kevinarpe
источник
5
Кажется, вы запускаете службу через запланированное задание. Если это должна быть служба, постоянно работающая в фоновом режиме, обратите внимание на NSSM в качестве альтернативы. Он запускает любую команду как службу Windows и обрабатывает перезапуск после сбоя и т. Д.
leemes
43

Он >>будет добавлять файл журнала, а не перезаписывать его каждый раз. Также 2>&1будут отправлены ошибки в ваш файл журнала.

cmd /c YourProgram.exe >> log.txt 2>&1
БелыйГорячийЛюбовьТигр
источник
40

У вас может быть debug.cmd, который вызывает yourscript.cmd

yourscript.cmd > logall.txt

вы планируете debug.cmd вместо yourscript.cmd

рене
источник
11

Используйте cmd.exeкомандный процессор для создания имени файла с меткой времени для регистрации вывода запланированной задачи.

Чтобы основываться на ответах других здесь, возможно, вы захотите создать выходной файл с датой и / или временем, встроенными в имя файла. Вы можете использовать cmd.exeкомандный процессор, чтобы сделать это за вас.

Примечание. Этот метод берет строковый вывод внутренних переменных среды Windows и разбивает их на части в зависимости от позиции символа. Из-за этого точные значения, приведенные в примерах ниже, могут не подходить для региона Windows, который вы используете. Кроме того, с некоторыми региональными настройками некоторые компоненты даты или времени могут вводить пробел в созданное имя файла, если их значение меньше 10. Чтобы смягчить эту проблему, заключите имя файла в кавычки, чтобы любые непредусмотренные пробелы в файле name не нарушит командную строку, которую вы создаете. Поэкспериментируйте и найдите то, что лучше всего подходит для вашей ситуации.

Имейте в виду, что PowerShellэто мощнее, чем cmd.exe. Одним из преимуществ этого метода является то, что он может работать с разными регионами Windows. Но этот ответ касается решения этой проблемы с помощью cmd.exe, а не PowerShell, поэтому мы продолжаем.

С помощью cmd.exe

Вы можете получить доступ к различным компонентам даты и времени, разрезав внутренние переменные среды %date%и %time%, как показано ниже (опять же, точные значения среза зависят от региона, настроенного в Windows):

  • Год (4 цифры): %date:~10,4%
  • Месяц (2 цифры): %date:~4,2%
  • День (2 цифры): %date:~7,2%
  • Час (2 цифры): %time:~0,2%
  • Минуты (2 цифры): %time:~3,2%
  • Второй (2 цифры): %time:~6,2%

Предположим, вы хотите, чтобы ваш файл журнала назывался в следующем формате даты / времени: " Log_[yyyyMMdd]_[hhmmss].txt". Вы бы использовали следующее:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

Чтобы проверить это, запустите следующую командную строку:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

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

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

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

В моем случае, если текущая дата / время были 10/05/2017 9:05:34 AM, приведенная выше командная строка выдала бы следующее:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
STLDev
источник
в часах меньше 10 нет
начального
9

Вы можете записать в файл журнала строки, которые хотите вывести, следующим образом:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

Таким образом, вы можете выбрать, какие команды выводить, если не хотите копаться во всем, просто получите то, что вам нужно увидеть. Он >выведет его в указанный файл (создав файл, если он не существует, и перезапишет его, если он существует). >>Добавит в файл , указанный (создание файла , если он не существует , но добавляющий к содержанию , если он делает).

Бали C
источник
2

Пример того, как запустить программу и записать stdout и stderr в файл с отметкой времени:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

Ключевой частью является двойная кавычка всей части позади cmd /cи внутри нее, как обычно, двойные кавычки. Также обратите внимание, что дата зависит от языкового стандарта, этот пример работает с использованием языкового стандарта США.

Давид Навркал
источник
0

Этот фрагмент кода использует wmic.exe для построения строки даты. Это не зависит от настроек локали

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
Джим Берч
источник