2008-11-18 14 views
101

Я знаю, я уже отвечал на подобный вопрос (Running Batch File in background when windows boots up), но на этот раз мне нужно, чтобы запустить партию:Windows XP или более поздняя версия Windows: как я могу запустить пакетный файл в фоновом режиме без отображения окна?

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

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

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

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


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

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

You запускают командный файл из дополнительного файла ANOTHER? У этого уже запущенного командного файла есть окно? – Oddthinking 2008-11-18 12:07:56

+0

Да, эта другая (первая) партия выполняется в окнах DOS. Тем не менее, я не хочу, чтобы вторая партия (запуск по первому асинхронному способу) отображала также окна (что бы происходило с командой «start/b») – VonC 2008-11-18 12:13:17

ответ

47

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

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

+1

Исправить. Я полагал, что start/b откроет новые окна, но если он будет выполнен из окон DOS, он будет использовать одни и те же окна. – VonC 2008-11-18 15:44:36

101

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

С первого сценария, вызовите второй сценарий с помощью следующей строки:

wscript.exe invis.vbs run.bat %* 

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

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

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

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

Вот 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 просмотров и что отличная почта + ответ, больше людей должны up up vote this thread – 2009-02-17 11:20:07

+0

Отличное решение, именно то, что мне нужно. – nikhil 2012-06-14 10:23:19

+0

Это отлично работает на Windows 7, 64-бит. Благодаря!! – 2014-01-09 15:04:53

3

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

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

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

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

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

+1

Интересный, но плотный перебор для этого сценария. – VonC 2008-11-18 15:46:03

12

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

+2

Возможно, но я постараюсь избежать лишнего шага в этом случае. – VonC 2008-11-18 15:54:13

3

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

8

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

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

Вот моя коллекция способов достижения этой цели - и даже больше - где это было возможно, я пытался вернуться также PID запущенного процесса (все связанные скрипты могут быть загружены и сохранены с любым именем вы найдете удобно):

1) IEXPRESS раствор может быть использован даже на старой победы 95/98. Iexpress - действительно древний инструмент, который все еще упакован с Windows - поскольку аргументы принимают только команду и ее аргументы.

Пример использования:

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

2) SCHTASKS - Опять принимает только два аргумента - команды и проверки arguments.Also, если он запускается с повышенными правами и, если это возможно получает PID процесса с WEVTUTIL (доступный от Vista и выше, так что новая версия Windows получит команду PID).

Пример использования:

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

3) 'WScript.Shell' - сценарий полон обертка «WScript.Shell» и каждый из возможных вариантов может быть установлен с помощью командной строки options.It это JScript/партия гибрид и его можно назвать летучей мышью.

Пример использования (для получения дополнительной информации печати с помощью «-h»):

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

4) 'Win32_ProcessStartup' - снова полный обертка и все опции доступны через командную строку arguments.This раз это WSF/пакетный гибрид с некоторыми Jscript и некоторыми фрагментами кода VBScript, но он возвращает PID запущенного процесса. Если процесс не скрыт, могут использоваться некоторые параметры, такие как координаты X/Y (не применимы для каждого исполняемого файла, но, например, cmd .exe принимает координаты).

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

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

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

Пример использования (для получения дополнительной информации распечатать справку с «-h»):

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