it-swarm-ru.tech

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

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

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

cmd /c start /min mybat.bat

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

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

144
Tom Dunham

Вы можете запустить его без вывода сообщений, используя файл сценария 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 означает "скрыть окно".

Полный синтаксис метод Run :

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

Аргументы:

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

Вы запускаете это как запланированное задание? Если это так, установите его для запуска под другой учетной записью пользователя, тогда он не будет виден вошедшему в систему пользователю. Если сценарию не нужен сетевой доступ к элементам, для которых требуется проверка подлинности Windows (например, к общим папкам или принтерам), вы можете запустить его как "nt полномочия\система" и оставить пароль пустым. В Windows 7 просто установите для пользователя значение SYSTEM и нажмите ОК.

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

JR

59
John Rennie

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

29
Peter Meinl

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

CHP.EXE mybat.bat

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

18
rocketmonkeys

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

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

cmdow @ /hid

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

cmdow /run /hid mybat.bat 
9
itsadok

Попробуйте вызвать скрипт с

start /b <command>
5
rashfeather

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

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

5
Doug Kavendek

Я понимаю, что на этот вопрос уже было дано достаточно хорошее разрешение, которое является родным для 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]

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

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

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

1
rubynorails

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

0
SteveC