Windows XP или более поздняя версия Windows: как запустить пакетный файл в фоновом режиме без отображения окна?
Я знаю, что уже ответил на аналогичный вопрос (запуск пакетного файла в фоновом режиме при загрузке Windows), но на этот раз мне нужно запустить пакет:
- из другой партии,
- без отображения окна консоли,
- со всеми аргументами, передаваемыми невидимой партии.
Первая партия выполняется в окне консоли. Однако я не хочу, чтобы второй пакет (запускаемый первым асинхронным способом) также отображал окно консоли.
Я придумал сценарий VBScript, который делает именно это, и я поставил этот сценарий как ответ, на который могли бы сослаться другие, но если у вас есть другие идеи / решения, не стесняйтесь вносить свой вклад.
Примечание. Окно консоли командного процессора Windows многими людьми называют не совсем правильным окном DOS.
Спасибо всем за ответы. Из того, что я понимаю, если мне нужно асинхронно вызывать скрипт для запуска в невидимом режиме:
- Из второго скрипта уже в окне консоли,
start /b
достаточно. - Из Windows, без вызова второго окна, мое решение остается в силе.
10 ответов
Вам нужен второй пакетный файл для асинхронной работы? Обычно один пакетный файл запускается другим синхронно с call
команда, и второй будет разделять окно первого.
Вы можете использовать start /b
second.bat для синхронного запуска второго пакетного файла с вашего первого, который разделяет окно вашего первого. Если оба командных файла записывают в консоль одновременно, выходные данные будут перекрываться и, вероятно, не будут расшифрованы. Кроме того, вы хотите поставить exit
команда в конце вашего второго пакетного файла, или вы будете в течение секунды cmd
Оболочка, как только все сделано.
Вот возможное решение:
Из вашего первого скрипта вызовите ваш второй скрипт со следующей строкой:
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
Преобразуйте пакетный файл в исполняемый файл. Попробуйте Bat To Exe Converter или Online Bat To Exe Converter, и выберите опцию, чтобы запустить его как приложение-призрак, то есть без окна.
Я думаю, что это самое простое и самое короткое решение для запуска пакетного файла без открытия окна 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 и путь соответственно.
Вот моя коллекция способов достижения этого - и даже больше - где это было возможно, я попытался вернуть также 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
Запустите его под другим именем пользователя, используя "runas" или запланировав его под другим пользователем в запланированных задачах Windows.
В другом вопросе я предложил 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.
Я знаю, что на это уже есть ответы, но если кто-то наткнется на это, это может помочь:
Вот хороший способ запустить его ПОЛНОСТЬЮ в фоновом режиме, не видя его. Единственный способ взаимодействия с ним - завершить его с помощью taskmgr или Process Hacker.
Для этого используется сторонний инструмент под названием NirCmd.
- Сделайте скрипт, содержащий этот код:
@echo off
nircmd exec hide "MainScript.bat"
Сохраните как хотите. "MainScript.bat" может быть чем угодно, но отметьте это позже.
Теперь создайте еще один сценарий с именем, которое вы указали ранее. Для примера я назову его MainScript.bat и дам ему следующий код:
@echo off
echo Can you see me now?
pause
exit
Это будет код, который вы хотите выполнить в фоновом режиме.
Убедитесь, что они находятся в одном каталоге, и загрузите NirCmd в тот же каталог.
Вот результат этих скриптов:
Примечание: NirCmd - не мой инструмент, но он все же полезен.
Вы также можете использовать
start /MIN notepad.exe
PS: К сожалению, минимизированное состояние окна зависит от команды для запуска. В.Г. не работает
start /MIN calc.exe
Вы можете запустить файл.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