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

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

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

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

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

Примечание. Консольное окно командного процессора Windows названо не очень правильным DOS-окном для многих людей.


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

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

Ответ 1

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

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

Ответ 2

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

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

wscript.exe invis.vbs run.bat %*

На самом деле вы вызываете vbs script с помощью:

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

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

  • intWindowStyle: 0 означает "невидимые окна"
  • bWaitOnReturn: false означает, что ваш первый script не должен ждать завершения второго script

Вот 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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Пакетный файл для запуска этого может выглядеть так (untested):

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

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

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

Ответ 7

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

Ответ 8

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