Назад | Перейти на главную страницу

Запустить .bat-файл в запланированной задаче без окна

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

Мне удалось сделать окно минимизированным, запустив запланированное задание

cmd /c start /min mybat.bat

но это дает мне новое командное окно каждый час. Меня это удивило, учитывая cmd /c «Выполняет команду, указанную в строке, а затем завершается» - должно быть, я неправильно понял документацию.

Есть ли способ запустить пакетный скрипт, не открывая окно cmd?

Вместо этого вы можете запустить его в автоматическом режиме, используя файл сценария Windows. Метод Run позволяет запускать скрипт в невидимом режиме. Создать .vbs файл как этот

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

и запланируйте это. Второй аргумент в этом примере устанавливает стиль окна. 0 означает «скрыть окно».

Полный синтаксис Метод запуска:

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

Аргументы:

  • объект: объект WshShell.
  • strCommand: строковое значение, указывающее командную строку, которую вы хотите запустить. Вы должны включить любые параметры, которые хотите передать исполняемому файлу.
  • intWindowStyle: Необязательно. Целочисленное значение, указывающее внешний вид окна программы. Обратите внимание, что не все программы используют эту информацию.
  • bWaitOnReturn: необязательно. Логическое значение, указывающее, должен ли сценарий ждать завершения выполнения программы перед переходом к следующему оператору в вашем сценарии. Если установлено значение true, выполнение сценария останавливается до завершения программы, а Run возвращает любой код ошибки, возвращаемый программой. Если установлено значение false (по умолчанию), метод Run возвращается сразу после запуска программы, автоматически возвращая 0 (не интерпретируется как код ошибки).

Вы выполняете это как запланированное задание? Если это так, установите его для работы под другой учетной записью, тогда он не будет виден вошедшему в систему пользователю. Если скрипту не требуется сетевой доступ к элементам, которым требуется авторизация Windows (например, к общим файловым ресурсам или принтерам), вы можете запустить его как «NT Authority \ system» и оставить пароль пустым. В Windows 7 просто установите пользователя в SYSTEM и нажмите OK.

(Вам, вероятно, придется использовать настоящего пользователя, хотя, если вы используете robocopy ...)

JR

Просто настройте запланированную задачу как «Запускать независимо от того, вошел пользователь в систему или нет».

Вы также можете попробовать CHP (Создать скрытый процесс), делает именно то, что вы думаете ...

CHP.EXE mybat.bat

Работает без командного окна. Отлично! Сделано теми же людьми, что и CMDOW, но это более уместно.

CMDOW это замечательный инструмент, который позволяет вам делать очень много вещей с окнами из командной строки.

Один из самых простых способов - скрыть текущее окно (обычно как первую строку в файле bat) с помощью:

cmdow @ /hid

или начать новый скрытый процесс с помощью

cmdow /run /hid mybat.bat 

Попробуйте запустить скрипт с помощью

start /b <command>

Вы можете создать ярлык для пакетного файла, установить ярлык для запуска в свернутом виде (в свойствах ярлыка, вкладка «Ярлык»), а затем настроить задание для запуска ярлыка.

Важный: Вам нужно будет указать путь к ярлыку вручную, введя его в текстовое поле «Выполнить» с расширением «.lnk»; если вы просто попытаетесь перейти к нему, он услужливо перенаправить себя на то, на что указывает ярлык.

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

Я также хотел сказать, что не согласен с комментарием @ splattne (но не с его фактическим ответом) - что разрешение в другом упомянутом потоке заслуживает похвалы. Этот ответ включает запуск сценария от имени другого пользователя (SYSTEM), что в значительной степени эквивалентно предоставлению корневого доступа сценарию. Это также не сработает для таких работ, как ROBOCOPY (как указано Джоном Ренни), для которых требуется доступ к сети.

Я никогда не пробовал CMDOW раньше, но я хотел бы предложить другое аналогичное разрешение, которое [хотя изначально не установлено в Windows] по-прежнему хорошо переносимо для большинства версий и поставляется как в 32-разрядной, так и в 64-разрядной версиях, и это NirCmd.

NirCmd - очень мощный инструмент с множеством опций, наиболее полезной из которых я лично считаю его способность запускать скрытые командные окна, просто выполняя следующее:

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

Из exec раздел Справочник команд NirCmd:

exec [show/hide/min/max] [application + command-line]

Запускает приложение и при необходимости указывает один или несколько параметров командной строки для выполняемого приложения. Шоу/скрывать/ min / max] параметр указывает, будет ли запущенное приложение видимым или нет. Если указано «скрыть», запущенное приложение не будет видно пользователю. Если указано «max», окно запущенного приложения будет развернуто. Если указано «min», окно работающего приложения будет свернуто.

РЕДАКТИРОВАТЬ: Я пытался запустить ROBOCOPY job и попробовал метод в этом ответе, и он не сработал даже после редактирования прав доступа к сети. Я попытался дважды щелкнуть скрипт и не смог заставить его работать, а смог только запустить его из командной строки с повышенными привилегиями. Я создал ярлык для командного файла и запустил его от имени администратора, и я смог запустить его, дважды щелкнув его, но метод, который я выбрал, заключался в том, чтобы запустить его скрытым как SYSTEM (я знаю, я знаю) - но он работает с ROBOCOPY, чего стоит, если пакетный файл имеет правильные разрешения.

РЕДАКТИРОВАТЬ 2: По какой-то причине он не будет работать как СИСТЕМА (вероятно, тот доступ к сети, о котором говорилось ранее) - я заметил это только после запуска ROBOCOPY без флага / L, который в основном представляет собой симуляцию и [по-видимому] фактически не подключается к удаленной системе, но когда я запускаю командный файл с наивысшими привилегиями и устанавливаю скрытый флажок, я все еще могу запустить его как вошедший в систему пользователь в фоновом режиме без отображения командного окна, чего бы это ни стоило.

Другое решение, которое я использовал, это Скрытый старт

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

Чтобы скрыть вывод (но не окно), добавьте это в начало командного файла:

@echo off