Як захопити вихідні дані сценарію, якщо його запускає планувальник завдань?


95

Як використовувати Windows Server 2008, як я можу взяти вихідні дані сценарію, який запускається із планувальником завдань Windows?

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


2
Іноді це не спрацьовує, тобто не створюється файл журналу. Одним із сценаріїв, що може призвести до цього, є те, що завдання взагалі не запускалося, оскільки Windows помилково вважає, що воно все ще працює. Ви можете відстежити це, заглянувши в історію завдань (вкладка історії у властивості завдання - інформація може зайняти кілька секунд)
Даніель

Відповіді:


83

Спробуйте це як командний рядок у Планувальнику завдань:

cmd /c yourscript.cmd > logall.txt

2
приємно, обгортка не потрібна, чудово працює, а також реєструє вихідні дані з дочірніх скриптів PowerShell, які викликаються з ініційованого планувальником завдань bat / cmd. Дякуємо!
Jonesome Reinstate Monica

8
Крім того, використовуйте, cmd /c "path with spaces/command.cmd > file.txt"якщо у вас є пробіли. Відповідь 2>&1від Івана також міститься всередині цитат.
Діней

3
потрібно використовувати подвійні лапки, щоб примусити мене працювати: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Тіло

1
Я знаю, що минуло 5 років, але змінивши це на прийняту відповідь, будучи мінімалістичним способом виконання завдання.
Mechaflash

Тепер у мене є командне вікно, яке відображається під час виконання завдання. Як цього запобігти?
Кріс

57

За допомогою stderr (куди переходить більшість помилок):

cmd /c yourscript.cmd > logall.txt 2>&1

56

Щоб доповнити відповідь @ user2744787, ось скріншот, який показує, як використовувати cmdаргументи у запланованому завданні:

Запланований вихід cmd завдання до журналу

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

Додайте аргументи: /c run_with_default_port.bat > IMQuantWebServices.log


5
Здається, ви запускаєте послугу за запланованим завданням. Якщо це повинна бути послуга, яка постійно працює у фоновому режимі, подивіться на NSSM як на альтернативу. Він виконує будь-яку команду як службу Windows і обробляє перезапуск після відмови тощо
leemes

43

Запис >>додасть файл журналу, а не перезаписуватиме його кожного разу. Повідомлення 2>&1також надсилатиме помилки до вашого журналу.

cmd /c YourProgram.exe >> log.txt 2>&1

39

Ви можете мати debug.cmd, який викликає ваш script.cmd

yourscript.cmd > logall.txt

Ви плануєте debug.cmd замість yourcript.cmd


10

Використовуйте 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

Зверніть увагу, що використання лапок навколо імені файлу для обробки примірників компонента дати чи часу може вводити пробіл.

У моєму випадку, якби поточною датою / часом були 05.05.2017 9:05:34, вищезазначений командний рядок видав би таке:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1

немає початкового нуля на години менше 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

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


1

Приклад запуску програми та запису 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% 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.