Windows XP або новіших версій Windows: Як я можу запустити пакетний файл у фоновому режимі без вікна?


121

Я знаю, що я вже відповів на подібне запитання ( Запуск пакетного файлу у фоновому режимі, коли Windows завантажується ), але цього разу мені потрібно запустити пакет:

  • з іншої партії,
  • без відображення вікна консолі,
  • з усіма аргументами передані невидимій партії.

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

Я придумав сценарій VBScript, який робить саме це, і я ставлю сценарій як відповідь, щоб інші посилалися , але якщо у вас є інші ідеї / рішення, не соромтеся робити внесок.

Примітка. Вікно консолі командного процесора Windows багатьма людьми названо не дуже правильним вікном DOS.


Дякую всім за відповіді. З того, що я розумію, якщо мені потрібно асинхронно викликати сценарій для запуску в невидимому режимі:

  • З другого сценарію, який вже знаходиться у вікні консолі, start /bдостатньо.
  • У Windows, не запускаючи друге вікно , моє рішення все ще діє.

Ви запускаєте пакетний файл з ще одного пакетного файлу? Чи має цей вже запущений пакетний файл вікно?
Відмінна думка

Так, ця інша (перша) партія виконується у вікнах DOS. Однак я не хочу, щоб друга партія (запуск першої асинхронним способом) відображала також вікна (що трапилося б із командою 'start / b')
VonC

Відповіді:


53

Вам потрібен другий пакетний файл, щоб запустити асинхронно? Зазвичай один пакетний файл виконує інший синхронно з callкомандою, а другий має спільне вікно першого.

Ви можете використовувати start /b second.bat запустити другий пакетний файл синхронно з вашим першим , що розділяє вікно вашого першого свого. Якщо обидва пакетні файли записують на консоль одночасно, вихід буде перекритим і, ймовірно, нерозбірливим. Крім того, ви хочете поставити команду в кінці другого пакетного файлу, або ви опинитесь у другій оболонці, коли все буде зроблено.exitcmd


1
Правильно. Я вважав, що start / b відкриє нове вікно, але якщо виконати з вікон DOS, він має ті самі вікна.
VonC

110

Ось можливе рішення:

З першого сценарію зателефонуйте другому сценарію наступним рядком:

wscript.exe invis.vbs run.bat %*

Насправді ви викликаєте сценарій vbs з:

  • [шлях] \ ім'я вашого сценарію
  • всі інші аргументи, необхідні вашому сценарію ( %*)

Потім invis.vbs зателефонує вашому сценарію методом Run Script Windows () , який потребує:

  • intWindowStyle: 0 означає "невидимі вікна"
  • bWaitOnReturn: false означає, що вашому першому сценарію не потрібно чекати завершення другого сценарію

Ось invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

3
2k перегляди і який чудовий пост + відповідь, більше людей повинно голосувати за цю тему
Рік Токіо

Чудове рішення, саме те, що мені було потрібно.
nikhil

Єдина проблема полягає в тому, що це створює процес під назвою "cmd.exe", який важко знайти в майбутньому.
Гупта

12

Перетворити пакетний файл в exe. Спробуйте конвертер Bat To Exe або Інтернет- конвертер Bat To Exe та оберіть опцію, щоб запустити його як привид, тобто немає вікна.


3
Можливо, але я спробую уникнути зайвого кроку в цьому випадку.
VonC

21
Я, як правило, не такий параноїк, але хіба не дуже було б дурно дозволити комусь анонімному генерувати цю програму для мене? Всі види шкідливих речей можна було вводити.
Тобіас

9

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

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

Скопіюйте рядки вище в редактор і збережіть файл із розширенням .VBS. Відредагуйте ім'я та шлях файлу .BAT відповідно.


1
Цікавий підхід, безумовно, коротший, ніж моє рішення. +1
VonC

Прекрасне рішення. Читаючи це, я помітив, що насправді не потрібно використовувати Set WshShell = Nothing, добре працював для мене, і у вас може бути ще менший спосіб це зробити.
Патрік Бард

7

Ось моя колекція способів досягти цього - і навіть більше - там, де це було можливо, я намагався повернути також PID розпочатого процесу (всі пов'язані сценарії можна завантажити та зберегти з будь-яким ім'ям, яке вам зручно):

1) Рішення IEXPRESS можна використовувати навіть на старих машинах win 95/98. Iexpress - це справді стародавній інструмент, який все ще постачається з Windows - як аргументи приймає лише команду та її аргументи.

Приклад використання:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2) SCHTASKS - знову приймає лише два аргументи - команду та аргументи. Також перевіряє, чи не запускається він з підвищеними дозволами і, якщо можливо, отримує PID процесу з WEVTUTIL (доступний з Vista та вище, тому новіша версія Windows отримає Команда PID).

Приклад використання:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3) 'WScript.Shell' - сценарій є повноцінною обгорткою 'WScript.Shell', і кожен можливий варіант може бути встановлений через параметри командного рядка. Це гібрид jscript / batch і його можна назвати як bat.

Приклад використання (для отримання додаткової інформації надрукуйте довідку з '-h'):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4) 'Win32_ProcessStartup' - знову повна обгортка та всі параметри доступні через аргументи командного рядка. Цього разу це WSF / пакетний гібрид з деяким Jscript та деякими фрагментами VBScript, але він повертає PID запущеного процесу. Якщо процес буде Не приховано деякі параметри, такі як координати X / Y, можуть бути використані (не застосовується для всіх виконуваних файлів - але, наприклад, cmd.exe приймає координати).

Приклад використання (для отримання додаткової інформації надрукуйте довідку з '-h'):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5). NET рішення . Більшість опцій ProcessStartInfo використовуються (але наприкінці я був занадто стомлений, щоб включити все):

Приклад використання (для отримання додаткової інформації надрукуйте довідку з '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2

В іншому питанні я запропонував autoexnt . Це теж можливо в цій ситуації. Просто встановіть, що служба запускається вручну (тобто не автоматично при запуску). Коли ви хочете запустити свою партію, змініть файл autoexnt.bat, щоб викликати потрібний пакетний файл, і запустіть службу autoexnt.

Пакетний файл, щоб почати це, може виглядати так (неперевірений):

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

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

Вам потрібно завантажити комплект ресурсів Windows 2003 . Комплект ресурсів також може бути встановлений на інших версіях Windows, таких як Windows XP.


1
Цікавий, але жорсткий перебір для цього сценарію.
VonC

2

Запустіть його під іншим іменем користувача, використовуючи "runas" або запланувавши його під іншим користувачем у програмі Windows Scheduled Tasks.


Можливо, але не зовсім те, що я маю (прямий асинхронний дзвінок у фоновому режимі)
VonC

0

Ви можете запустити .bat файл через файл .vbs
Скопіюйте такий код у свій .vbs файл:

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 

0

Ви також можете використовувати

start /MIN notepad.exe

PS: На жаль, мінімальний стан вікна залежить від команди для виконання. VG не працює

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