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

<p>я знаю, что уже ответил на аналогичный вопрос ( <a href="https://stackoverflow.com/questions/289498">запуск batch file в фоновом режиме при загрузке windows</a> ), но на этот раз мне нужно запустить пакет:</p><ul> <li>из другой партии,</li> <li>без отображения окна консоли,</li> <li><em> со всеми аргументами </em>, переданными невидимой партии.</li> </ul><p>первая партия выполняется в окне консоли. однако я не хочу, чтобы второй пакет (запускаемый первым асинхронным способом <strong> </strong>) также отображал окно консоли.</p><p>я придумал сценарий vbscript, который делает именно это, и я поставил сценарий как <a href="https://stackoverflow.com/questions/298562#298564">ответ для других, чтобы ссылаться на него</a> , но если у вас есть другие идеи/решения, не стесняйтесь вносить свой вклад.</p><p>примечание. окно консоли командного процессора windows многими людьми называют не совсем правильным окном dos.</p><hr><p>спасибо всем за ответы. из того, что я понимаю, если мне нужно асинхронно вызывать скрипт для запуска в невидимом режиме:</p><ul> <li>из второго скрипта, уже находящегося в окне консоли, <strong><code>start /b</code></strong> достаточно.</li> <li>в windows <em> без вызова второго окна </em> мое решение остается в силе.</li> </ul>

<p>вам нужен второй пакетный файл для асинхронной работы? обычно один пакетный файл запускается другим синхронно с командой <code>call</code>, а второй разделяет окно первого.</p><p>вы <strong>можете</strong> использовать <code>start /b</code> <em> second.bat </em> для запуска второго пакетного файла <strong>a</strong> синхронно с вашим первым который разделяет ваше первое окно. если оба командных файла записывают на консоль одновременно, выходные данные будут перекрываться и, вероятно, не будут расшифрованы. кроме того, вы захотите поместить команду <code>exit</code> в конец вашего второго пакетного файла, или вы будете в пределах второй оболочки <code>cmd</code>, как только все будет сделано.</p>

<p>вот возможное решение:</p><p>из вашего первого скрипта вызовите ваш второй скрипт со следующей строкой:</p><pre><code>wscript.exe invis.vbs run.bat %* </code></pre><p>на самом деле, вы вызываете скрипт vbs с:</p><ul> <li>[путь]\имя вашего скрипта</li> <li>все остальные аргументы, необходимые вашему скрипту (<code>%*</code>)</li> </ul><p>затем invis.vbs вызовет ваш скрипт с помощью <a href="http://msdn.microsoft.com/en-us/library/d5fk67ky(vs.85).aspx">метод windows script host run ()</a> , который принимает:</p><ul> <li>intwindowstyle: 0 означает "невидимые окна"</li> <li>bwaitonreturn: false означает, что вашему первому сценарию не нужно ждать завершения второго сценария</li> </ul><p>вот invis.vbs:</p><pre class="lang-vbs prettyprint-override"><code>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 </code></pre>

<p>преобразуйте пакетный файл в исполняемый файл. попробуйте <a href="http://www.f2ko.de/programs.php?lang=en&pid=b2e">bat to exe converter</a> или <a href="http://www.f2ko.de/programs.php?lang=en&pid=ob2e">online bat to exe converter</a> и выберите опцию, чтобы запускать его как приложение-призрак, то есть без окна.</p>

<p>я думаю, что это самое простое и самое короткое решение для запуска пакетного файла без открытия окна dos, оно может сильно отвлекать, если вы хотите запланировать набор команд для периодического запуска, поэтому окно dos продолжает появляться, вот ваше решение , используйте vbs script для вызова командного файла ...</p><pre class="lang-vbs prettyprint-override"><code>set wshshell = createobject("wscript.shell" ) wshshell.run chr(34) & "c:\batch files\ mycommands.bat" & chr(34), 0 set wshshell = nothing </code></pre><p>скопируйте строки выше в редактор и сохраните файл с расширением .vbs. отредактируйте имя файла .bat и путь соответственно.</p>

<p>вот моя коллекция способов добиться этого - и даже больше - там, где это было возможно, я попытался вернуть также pid запущенного процесса (все связанные скрипты могут быть загружены и сохранены под любым удобным для вас именем):</p><p>1) решение <strong> <a href="https://github.com/npocmaka/batch.scripts/blob/master/hybrids/iexpress/hidder.bat">iexpress</a> </strong> можно использовать даже на старых машинах win 95/98. iexpress - действительно древний инструмент, который все еще поставляется с windows - в качестве аргументов принимаются только команда и ее аргументы.</p><p>пример использования:</p><pre><code>call iexphidden.bat "cmd /c mybat.bat" "argument" </code></pre><p>2) <strong> <a href="https://github.com/npocmaka/batch.scripts/blob/master/processesutils/starthidden.bat">schtasks</a> </strong> - снова принимает только два аргумента - команду и аргументы. также проверяется, запущен ли он с повышенными разрешений и, если возможно, получает pid процесса с помощью wevtutil (доступно из vista и выше, поэтому более новая версия windows получит команду pid).</p><p>пример использования:</p><pre><code>call schphidden.bat "cmd /c mybat.bat" "argument" </code></pre><p>3) <strong> <a href="https://github.com/npocmaka/batch.scripts/blob/master/hybrids/jscript/shellrunjs.bat">'wscript.shell'</a> </strong> - скрипт является полной оболочкой для wscript.shell, и каждый возможный параметр может быть установить через параметры командной строки. это гибрид jscript/batch и может называться летучей мышью.</p><p>пример использования (для получения дополнительной информации напечатайте справку с '-h'):</p><pre><code>call shellrunjs.bat "notepad.exe" -style 0 -wait no </code></pre><p>4) <strong> <a href="https://github.com/npocmaka/batch.scripts/blob/master/hybrids/wsh/win32process.bat">'win32\_processstartup'</a> </strong> - снова полная оболочка и все параметры доступны через аргументы командной строки. на этот раз wsf/пакетный гибрид с некоторыми jscript и некоторыми частями кода vbscript - но он возвращает pid запущенного процесса. если процесс не скрыт, можно использовать некоторые параметры, такие как координаты x/y (не применимо для каждого исполняемого файла - но, например, cmd.exe) принимает координаты).</p><p>пример использования (для получения дополнительной информации напечатайте справку с '-h'):</p><pre><code>call win32process.bat "notepad" -arguments "/a openfile.txt" -showwindows 0 -title "notepad" </code></pre><p>5). <strong> <a href="https://github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/processstartjs.bat">net решение</a> </strong>. используются большинство параметров processstartinfo (но в конце концов я слишком устал, чтобы включать все):</p><p>пример использования (для получения дополнительной информации напечатайте справку с '-h'):</p><pre><code>call processstartjs.bat "notepad" -arguments "/a openfile.txt" -style hidden -directory "." -title "notepad" -priority normal </code></pre>

<p>запустите его под другим именем пользователя, используя "runas" или запланировав его под другим пользователем в запланированных задачах windows.</p>

<p>в другом вопросе я предложил <a href="http://support.microsoft.com/kb/243486">autoexnt</a> . это также возможно в этой ситуации. просто установите службу для запуска вручную (т.е. не автоматически при запуске). если вы хотите запустить пакет, измените файл autoexnt.bat, чтобы вызвать нужный пакетный файл, и запустите службу autoexnt.</p><p>пакетный файл для запуска может выглядеть так (не проверено):</p><pre><code>echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat net start autoexnt </code></pre><p>обратите внимание, что пакетные файлы, запущенные таким образом, запускаются от имени системного пользователя, что означает, что у вас нет автоматического доступа к сетевым ресурсам. но вы можете использовать <em> net use </em> для подключения к удаленному серверу.</p><p>вы должны <a href="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en">скачать windows 2003 resource kit</a> , чтобы получить его. resource kit также может быть установлен в других версиях windows, таких как windows xp.</p>

<p>вы также можете использовать</p><pre><code>start /min notepad.exe </code></pre><p>ps: к сожалению, минимизированное состояние окна зависит от команды для запуска. в.г. не работает</p><pre><code>start /min calc.exe </code></pre>

<p>вы можете запустить файл .bat через файл .vbs<br> скопируйте следующий код в ваш файл .vbs:</p><pre><code>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 </code></pre>