it-swarm.com.ru

Windows XP или более поздняя версия Windows: Как запустить пакетный файл в фоновом режиме без отображения окна?

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

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

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

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

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


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

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

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

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

51
P Daddy

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

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

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
109
VonC

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

12
Rob Kam

Я думаю, что это самое простое и самое короткое решение для запуска пакетного файла без открытия окна DOS, оно может сильно отвлекать, если вы хотите запланировать набор команд для периодического запуска, поэтому окно DOS продолжает появляться, вот ваше решение , Используйте VBS Script для вызова командного файла ...

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

Скопируйте строки выше в редактор и сохраните файл с расширением .VBS. Отредактируйте имя файла .BAT и путь соответственно.

8
indago

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

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

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

2
JosephStyons

В другом вопросе я предложил 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.

2
wimh

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

start /MIN notepad.exe

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

start /MIN calc.exe
0
user2928048

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