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


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

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

cmd /c start /min mybat.bat

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

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


138
2018-05-17 09:00


Источник


Я нашел этот ответ более предпочтительным stackoverflow.com/questions/6568736/... - Efekt


Ответы:


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

141
2018-05-17 09:08



+1, просто написал точно то же самое - Sam Cogan
Я видел его, прежде чем удалять его. Думаю, мы оба боты. ;-) - splattne
имя пользователя, я честно считаю, что Сэм заслуживает этого гораздо больше, чем я. Но спасибо вам в любом случае! И не упоминайте меня и Джона Скита в том же предложении. Это богохульство! ;-) - splattne
На вопрос «Есть ли способ запустить пакетный скрипт без его появления CMD-окна?», Он дает очень прямой ответ: запустите его с помощью файла сценария Windows. - Mark Meuer
@Lee Я думаю, что двойные кавычки необходимы, если ваш путь содержит пробелы. - splattne


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

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

JR


55
2018-05-17 09:13



Спасибо - это было меньше хлопот для меня, чем опция .vbs. - mackenir
Мне нравится эта идея, но я единственный пользователь на этом рабочем столе, и ее рабочий компьютер так не может создавать другие. Когда когда-либо я выбираю что-либо еще в поле «Запуск от», он запрашивает пароль и подтверждение, из которых моя сбой. - IanVaughan
Я установил для пользователя «Run as» значение SYSTEM (которое позже изменил O NT AUTHORITY \ SYSTEM), и это сработало для меня. Я больше не вижу всплывающее окно CMD, когда запускается запланированное задание. Благодаря! - Ryan Stille
+1, это элегантно. Обязательно введите «система» в качестве имени пользователя, затем win7 сделает для вас остальное. Обратите внимание, что вы получаете доступ к сети в Интернете, а не к сетевым ресурсам и вещам, требующим авторизации Windows. - samsmith
Пользователь системы прост и элегантен, отличный TIP! +1! - Matteo Conta


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


27
2017-10-04 20:06



Отлично! Вы даже можете отключить хранилище учетных данных, а затем это станет более безопасным, чем запуск системы SYSTEM! - binki


Вы также можете попробовать ТЭЦ (создание скрытого процесса), делает именно то, что вы думаете ...

CHP.EXE mybat.bat

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


17
2017-07-20 21:54



Работает отлично, когда вам нужно запустить задачу в контексте зарегистрированного пользователя («Триггер: при подключении к сеансу пользователя», «Запуск задачи как: Пользователи») - Sergei
это не встроенный инструмент - Jonny Leeds


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

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

cmdow @ /hid

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

cmdow /run /hid mybat.bat 

9
2018-05-17 11:30



И это, и предложение Rocketmonkeys включают загрузку новых инструментов, что означает большую совместимость с настольными компьютерами разных народов. Запеченный, используя команды windows намного лучше. - IanVaughan
Плюс cmdow определяется как «опасный» некоторыми антивирусными программами (это не опасно, но обнаружение может вызвать некоторые проблемы, если файл cmdow помещен в карантин ...). - Otiel
есть еще консоль всплывающих окон, просто быстро запустите. - Bamboo


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

start /b <command>

5
2018-05-17 14:54



Это не работает, состояние «Запланированная задача» - «Состояние» не может быть запущено, то есть: start / b C: \ file.bat: и: start / b «C: \ file.bat»: но: C: \ file.bat: работает отлично. - IanVaughan
Потому как start это не программа, это команда. Вы должны указать cmd как программа для запуска и /c start /b <file> как аргумент. Однако это все равно не сработает, потому что оно все равно создаст консольное окно для cmd и закроет черное окно на экране. - Synetech
Также можно подтвердить с помощью @Synetech, что это не создаст новое окно, но вам все равно нужно открыть консольное окно, чтобы запустить его. Это действительно удобная команда, но не может использоваться по запросу с запланированными задачами. - JonathanDavidArndt


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

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


5
2017-08-11 16:49



Это не работает в Windows 10 x64, это дает всплывающее окно «Как вы хотите открыть этот файл?» - Jan


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

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

EDIT 2: По какой-то причине он не будет работать как SYSTEM (возможно, ссылка на доступ к сети, ссылка на которую была ранее) - я заметил это только после фактического запуска ROBOCOPY без флага / L, который в основном является просто симуляцией и [по-видимому] фактически не подключается к удаленной системе, но когда я запускаю командный файл с наивысшими привилегиями и проверяю скрытое поле, и я все еще могу запустить его как зарегистрированный пользователь в фоновом режиме без окна командной строки, для чего это никому не нужно.


1
2018-05-01 03:38