Запустіть .bat файл у запланованому завданні без вікна


143

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

Мені вдалося зробити так, щоб вікно було мінімізоване, зробивши запуск запланованої роботи

cmd /c start /min mybat.bat

але це дає мені нове вікно команд щогодини. Мене це здивувало, давши cmd /c"Виконує команду, задану рядком, а потім завершує" - я, мабуть, неправильно зрозумів документи.

Чи є спосіб запустити пакетний скрипт, не вискочивши вікно cmd?


Я знайшов цю відповідь більш кращою відповіддю stackoverflow.com/questions/6568736/…
Efekt

Відповіді:


144

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

+1, просто написав абсолютно те саме
Сем Коган

Я бачив це, перш ніж ви його видалили. Я думаю, ми обидва боти. ;-)
splattne

1
ім'я користувача, я чесно думаю, що Сем заслуговує цього набагато більше, ніж я. Але дякую все одно! І не згадуйте мене та Джон Скіта в одному реченні. Це богохульство! ;-)
splattne

3
На питання "Чи є спосіб запустити пакетний скрипт, не вискочивши вікно cmd?", Він дає дуже прямий відповідь: Запустіть його за допомогою файлу Windows Script.
Марк Меуер

2
@Lee Я думаю, подвійні лапки потрібні, якщо ваш шлях містить пробіли.
splattne

58

Ви виконуєте це як заплановане завдання? Якщо це встановлено так, щоб він працював як інший обліковий запис користувача, він не буде видно зареєстрованому користувачеві. Якщо сценарію не потрібен доступ до мережі до елементів, для яких потрібна програма auth windows (наприклад, спільні файли або принтери), ви можете запустити його як "nt повноваження \ система" і залишити пароль порожнім. У Windows 7 просто встановіть користувача на SYSTEM і натисніть кнопку OK.

(Можливо, вам доведеться використовувати справжнього користувача, хоча ви використовуєте роботокопію ...)

JR


3
Спасибі - це було менше клопоту для мене, ніж варіант .vbs.
mackenir

8
Я встановив користувача "Запустити як" в СИСТЕМУ (яку згодом змінив o NT AUTHORITY \ SYSTEM), і вона працювала на мене. Я більше не бачу спливаючого вікна CMD, коли виконується заплановане завдання. Дякую!
Райан Стілле

1
+1, це елегантно. Не забудьте ввести "систему" як ім'я користувача, тоді win7 зробить все для вас. Зауважте, що ви дійсно отримуєте доступ до мережі Інтернет, тільки не до мережевих спільних ресурсів і речей, для яких потрібна програма Windows.
Самсміт

1
Користувач системи - це просто і елегантно, чудовий ПІДКАЗ! +1!
Маттео Контакт

1
Див Реалізації найменш Privilege адміністративні моделі . Чи використання цього облікового запису системи є порушенням політики найменших привілеїв? Якщо так, то адміністратори повинні знати, що цього не робити в більшості ситуацій.
користувач34660

29

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


6
Ідеально! Ви навіть можете відключити сховище даних, і тоді це виявиться більш безпечним, ніж запуск системи SYSTEM!
бінкі

17

Ви також можете спробувати CHP (Створити прихований процес) , робить саме те, що ви думаєте ...

CHP.EXE mybat.bat

Працює без вікна команд. Ідеально! Зроблено тими ж людьми, що і CMDOW, але це більш доречно.


Відмінно працює, коли потрібно виконати завдання в контексті зареєстрованого користувача ("Тригер: при підключенні до сеансу користувача", "Запустити завдання як: Користувачі")
Сергій

1
це не вбудований інструмент
JonnyRaa

9

CMDOW - дивовижний інструмент, який дозволяє зробити багато, багато речей для Windows з командного рядка.

Одна з найпростіших речей - це приховати поточне вікно (як правило, як перший рядок у файлі bat) за допомогою:

cmdow @ /hid

або почати новий прихований процес із

cmdow /run /hid mybat.bat 

4
І це, і пропозиція Rocketmonkeys передбачають завантаження нових інструментів, що означає більшу сумісність для різних настільних комп'ютерів. Запечений, використовуючи команди Windows, набагато краще.
IanVaughan

Плюс cmdow визначається як "небезпечний" деякими антивірусними програмами (це не небезпечно, але виявлення може само собою спричинити деякі проблеми, якщо файл cmdow знаходиться на карантині ...).
Отьєль

3
Є ще спливаюча консоль, просто спалахне дуже швидко.
Бамбук

5

Спробуйте викликати сценарій за допомогою

start /b <command>

1
Це не працює, Запланована задача-> Статус повідомляє "Не вдалося запустити", тобто з: start / b C: \ file.bat: і: start / b "C: \ file.bat": але: C: \ file.bat: працює чудово.
IanVaughan

1
Тому що startце не програма, це команда. Вам потрібно вказати cmdяк програму для запуску і /c start /b <file>як аргумент. Однак це все ще не спрацює, оскільки воно все одно створить вікно консолі cmdта прошиває чорне вікно на екрані.
Synetech

1
Також можна підтвердити за допомогою @Synetech, що це не створить нове вікно, але для його запуску все ж потрібно відкрити консольне вікно. Це дійсно зручна команда, але її не можна використовувати так, як вимагається із запланованими завданнями.
JonathanDavidArndt

5

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

Важливо : Вам потрібно буде вказати шлях до ярлика вручну, ввівши його в текстове поле Запустити, доповнене розширенням '.lnk'; якщо ви просто спробуєте перейти до нього, він корисно переспрямує себе на те, на що вказує ярлик.


Це не працює в Windows 10 x64, це дає спливаюче вікно "Як ви хочете відкрити цей файл?"
Jan

1

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

Я також хотів сказати, що я не погоджуюся з коментарем @ splattne (але не його фактичною відповіддю) - що резолюція в іншій посилальній темі заслуговує на заслугу. Ця відповідь передбачає запуск сценарію як інший користувач (SYSTEM), що майже в еквіваленті надання доступу до скрипта root. Він також не зможе виконати такі завдання, як 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]

Запускає додаток і необов'язково вказує один або кілька параметрів командного рядка для виконаної програми. Параметр [показати / приховати / хв / макс] визначає, чи буде видима запущена програма чи ні. Якщо вказано "приховати", запущена програма не буде видима користувачеві. Якщо вказано 'max', вікно запущеного додатка буде максимальним. Якщо вказано 'min', запущене вікно програми буде мінімізоване.

EDIT: Я намагався запустити ROBOCOPYроботу і спробував метод у цій відповіді, і це не вийшло навіть після редагування прав доступу до мережі. Я спробував двічі клацнути скрипт і не міг змусити його працювати, але міг лише змусити його працювати під підвищеним командним рядком. Я створив ярлик до пакетного файлу і запустив його як адміністратор, і міг змусити його виконати, двічі клацнувши його, але метод, з яким я закінчився, - запустити його приховано як SYSTEM (я знаю, я знаю) - але це працює з тим ROBOCOPY, на що це варто, доки пакетний файл має правильні дозволи.

EDIT 2: Чомусь це не працюватиме як СИСТЕМА (ймовірно, про те, про що було сказано раніше, про доступ до мережі) - я помітив це лише після фактичного запуску ROBOCOPYбез прапора / L, що в основному є лише моделюванням і [мабуть] не насправді підключаємось до віддаленої системи, але коли я запускаю пакетний файл із найвищими привілеями і перевіряю приховане поле, і я все одно можу запустити його як зареєстрований користувач у фоновому режимі, не показуючи вікно команд, для чого б це не було кому .



-2

Спробуйте ввести команду виходу в кінці вашого пакетного файлу. Це має закрити вікно команд, коли сценарій виконаний.


-2

Щоб приховати вихід (хоча не вікно), додайте це до початку вашого пакетного файлу:

@echo off
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.