Windows XP или более поздняя версия Windows: как запустить пакетный файл в фоновом режиме без отображения окна? - PullRequest
114 голосов
/ 18 ноября 2008

Я знаю, что уже ответил на аналогичный вопрос ( Запуск пакетного файла в фоновом режиме при загрузке Windows ), но на этот раз мне нужно запустить пакет:

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

Первый пакет выполняется в окне консоли. Однако я не хочу, чтобы второй пакет (запускаемый первым асинхронным способом ) также отображал окно консоли.

Я придумал скрипт VBScript, который делает именно это, и я поставил сценарий как ответ , чтобы другие ссылались на , но если у вас есть другие идеи / решения, не стесняйтесь вносить свой вклад.

Примечание. Многие пользователи называют окно консоли командного процессора Windows не совсем правильным.


Спасибо всем за ответы. Из того, что я понимаю, если мне нужно асинхронно вызывать скрипт для запуска в невидимом режиме:

  • Из второго скрипта, уже находящегося в окне консоли, достаточно start /b.
  • Из Windows, без запуска второго окна , мое решение все еще действует.

Ответы [ 9 ]

109 голосов
/ 18 ноября 2008

Вот возможное решение:

Из вашего первого скрипта вызовите ваш второй скрипт со следующей строкой:

wscript.exe invis.vbs run.bat %*

На самом деле вы вызываете скрипт vbs с:

  • [путь] \ имя вашего скрипта
  • все остальные аргументы, необходимые вашему скрипту (%*)

Затем invis.vbs вызовет ваш скрипт с помощью метода Windows Script Host Run () , который принимает:

  • 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
51 голосов
/ 18 ноября 2008

Вам нужен второй пакетный файл для асинхронной работы? Обычно один пакетный файл запускается другим синхронно с командой call, а второй разделяет окно первого.

Вы можете использовать start /b second.bat для запуска второго пакетного файла a синхронно с вашим первым, который использует окно вашего первого. Если оба командных файла записывают на консоль одновременно, выходные данные будут перекрываться и, вероятно, не будут расшифрованы. Кроме того, вы захотите поместить команду exit в конец вашего второго пакетного файла, или вы будете внутри второй оболочки cmd, как только все будет сделано.

12 голосов
/ 18 ноября 2008

Преобразование командного файла в исполняемый файл. Попробуйте Bat To Exe Converter или Online Bat To Exe Converter , и выберите опцию, чтобы запустить его как приложение-призрак, т.е. без окна.

8 голосов
/ 15 января 2014

Я думаю, что это самое простое и самое короткое решение для запуска пакетного файла без открытия окна 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 и путь.

7 голосов
/ 15 октября 2015

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

Пример использования (для получения дополнительной информации напечатайте справку с '-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 голосов
/ 18 ноября 2008

Запустите его под другим именем пользователя, используя «runas» или запланировав его под другим пользователем в запланированных задачах Windows.

2 голосов
/ 18 ноября 2008

В другом вопросе я предложил autoexnt . Это также возможно в этой ситуации. Просто установите службу для запуска вручную (т.е. не автоматически при запуске). Если вы хотите запустить пакет, измените файл autoexnt.bat, чтобы вызвать нужный пакетный файл, и запустите службу autoexnt.

Пакетный файл для запуска может выглядеть следующим образом (не проверено):

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

Обратите внимание, что пакетные файлы, запущенные таким образом, запускаются от имени системного пользователя, что означает, что у вас нет автоматического доступа к сетевым ресурсам. Но вы можете использовать net use для подключения к удаленному серверу.

Вам необходимо загрузить Windows 2003 Resource Kit , чтобы получить его. Resource Kit также можно установить на другие версии Windows, например Windows XP.

0 голосов
/ 13 марта 2019

Вы также можете использовать

start /MIN notepad.exe

PS: к сожалению, минимизированное состояние окна зависит от команды для запуска. В.Г. не работает

start /MIN calc.exe
0 голосов
/ 31 января 2014

Вы можете запустить файл .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 
...