Как запустить командный файл без запуска «командного окна»? [Дубликат]

131

На этот вопрос уже есть ответ здесь:

В Windows XP можно ли запустить пакетный файл (.bat или .cmd) через ярлык без «черного окна»?

dugres
источник
6
Вы спрашиваете, можете ли вы запретить отображение командного окна при запуске файла bat?
Эрик
6
Да, вы можете легко изменить цвет окна вывода по умолчанию, используя свойства ярлыка cmd.exe. (да это шутка ...)
Toby J

Ответы:

86

Сохраните следующее как wscript, например, hidecmd.vbs после замены «testing.bat» именем вашего пакетного файла.

Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c testing.bat"
oShell.Run strArgs, 0, false

Второй параметр oShell.Run- это intWindowStyleзначение, указывающее внешний вид окна программы, а нулевое значение - для скрытого окна.

Ссылка здесь http://msdn.microsoft.com/en-us/library/d5fk67ky.aspx

Шарджил Азиз
источник
Будет ли третья строка: strArgs = "cmd / c FILEPATH \ testing.bat"?
Дан З
1
Любой способ запустить летучую мышь в повышенном режиме, оставаясь при этом невидимым?
Лорен Сварт
Как запустить .batфайл от имени администратора с помощью этого метода?
Мехди Дегхани
44

Это просто упрощение ответа Шаджи. Вы можете запустить свой пакетный скрипт через скрипт VBScript (.vbs) следующим образом:

'HideBat.vbs
CreateObject("Wscript.Shell").Run "your_batch_file.bat", 0, True

Это выполнит ваш командный файл без показанного командного окна.

greatwolf
источник
Как запустить .batфайл от имени администратора, используя этот метод?
Мехди Дегхани
@MehdiDehghani properties> security> запускать от имени администратора. Если это работает только для exe или приложений, то да ладно.
TaylorS
21

Просто чтобы развернуть ответы «Использовать сценарии Windows» (которые я считаю лучше всего, потому что они уже встроены), вот как это сделать, используя один скрипт-обертку и передавая имя «реального» пакетного файла в качестве параметра. Дополнительные параметры будут переданы в командный файл.

If WScript.Arguments.Count >= 1 Then
    ReDim arr(WScript.Arguments.Count-1)
    For i = 0 To WScript.Arguments.Count-1
        Arg = WScript.Arguments(i)
        If InStr(Arg, " ") > 0 Then Arg = """" & Arg & """"
      arr(i) = Arg
    Next

    RunCmd = Join(arr)
    CreateObject("Wscript.Shell").Run RunCmd, 0, True
End If

Так, например, сохраните указанный выше файл как- NoShell.vbsнибудь, затем вызовите:

NoShell.vbs c:\foo\my_batch_file.bat

Наконец, если вы хотите запустить это откуда-то, которое не понимает файл .vbs (например, «Внешние инструменты» в Visual Studio), вы захотите вызвать C:\Windows\System32\wscript.exeфайл vbs в качестве первого параметра и ваш командный файл как второй.

Тоби Дж
источник
6
Для тех, кому не нравится идея и концепция создания нового файла VBS для каждого нового создаваемого файла bat, так как нужно использовать любой из двух верхних ответов, это идеальное решение. Вместо нескольких файлов VBS у вас будет несколько ярлыков. Для каждого нового файла bat создайте ярлык файла vbs, щелкните его правой кнопкой мыши, выберите «Свойства»> вкладка «Ярлыки» и в поле «Цель» введите путь к файлу bat после пути, который уже существует, как показано выше или как это если ярлык не в том же месте , как подать на VBS: "C:\My Files\HideCmd.vbs" c:\foo\my_batch_file.bat.
Роло
Если путь к файлу bat имеет пробел, как его можно вызвать с помощью ярлыка для файла VBS? Например: "C:\My Files\HideCmd.vbs" c:\my things\my_batch_file.bat. Неважно, что я пытаюсь найти для пути - двойные кавычки вокруг всего этого,% 20 вместо пробела или комбинация этих двух, ничего не работает. Я получаю сообщение об ошибке, сообщающее, что файл не найден или ничего не происходит. Это из-за ошибки пользователя с моей стороны, ограничения Windows с полем Target для ярлыков или проблемы со скриптом vbs, в котором он не обрабатывает пути к файлам с пробелами должным образом?
Роло
@Rolo Я обновил скрипт, так что если какой-либо из входящих параметров имеет пробелы, он будет заключен в кавычки. Таким образом, вы захотите заключить путь к пакетному файлу в кавычки при его вызове, тогда он будет считаться одним аргументом и будет переупакован перед вызовом.
Тоби Дж
9

Вы можете изменить свойства ярлыка для запуска свернутым.

Чтобы запустить его полностью незаметно, вам понадобится что-то еще, например Windows Scripting.

пиво
источник
1
Ваше первое предложение - это то, как я всегда это делал.
Мартино
8

Используйте начало с опции '/ B'. Например:

@echo off
start /B go.bat
ZAF
источник
25
start /bпросто запустит программу в выделенной в данный момент консоли вместо того, чтобы создавать новую. В любом случае вы получите новый, так как пакет должен работать с cmd (который, в свою очередь, [сюрприз] открывает консоль).
Джои
@ Да, да, но это очень полезно для запуска командных файлов из других приложений посредством выполнения оболочки (как SYSTEMв C / C ++).
Томаш Зато
1
@ TomášZato: В этом случае вы можете просто вызвать пакетный файл напрямую или, если то, что вы используете для запуска процесса, сначала не создает оболочку, использовать cmd /c foo.cmd. Нет абсолютно никакой необходимости использовать startв этих сценариях, и я бы сказал, что systemне следует использовать в пользу CreateProcess. Запуская пакетный файл, вы уже зависите от одной платформы, вы также можете использовать лучшие инструменты для этой работы.
Джои
@Joey Спасибо большое, никогда не слышал cmd /cраньше. Команда cmd - это то, что мне было нужно в моем случае, но все ответы на стек, которые я нашел до сих пор, о командном файле, на котором запущен другой командный файл, имеют лучшие ответы для использования start ...
T_D
start /b go.bat не будет выделять новую консоль (т. е. экземпляр conhost.exe - или поток в csrss.exe до Windows 7). Однако это приведет к путанице, поскольку пакетный скрипт запускается с новым экземпляром cmd.exe, который подключен к той же консоли . Оба экземпляра оболочки будут конкурировать за чтение ввода с консоли, как правило, поочередно. Это нужно /w(например start /b /w go.bat) для того, чтобы ждать второго экземпляра, что похоже на использование cmd /cпри использовании system. Кроме того, если вы звоните CreateProcess, бегите go.batнапрямую. Там нет необходимости cmd /c.
Eryk Sun
6

Бесплатный GPL с открытым исходным кодом "Создать скрытый процесс"

http://www.commandline.co.uk/chp/

Microsoft Security Essentials и, возможно, большинство других сканеров вирусов и вредоносных программ будут относиться к исполняемому файлу chp.exe как к вирусу, поскольку он скрывает любую указанную программу от отображения окна или кнопки панели задач, как это делают вирусы.

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

Вы даже не должны верить, что включенный chp.exe действительно был собран из этого источника. Вы можете отказаться от прилагаемого chp.exe и скомпилировать свой собственный из исходного кода, и все необходимые инструменты для этого даже бесплатны и загружаемы.


Вы также можете просто создать ярлык для файла .bat или .cmd, затем щелкнуть правой кнопкой мыши ярлык, Свойства, вкладку Ярлык, Выполнить: свернуто. Затем в запланированных задачах используйте ярлык вместо файла .bat / .cmd напрямую. Это предотвратит появление окна, но кнопка панели задач все равно появится.

волнолом
источник
6

Вы можете использовать сценарии окна, такие как AutoIt .

Например, просто напишите это в редактор сценариев AutoIt. Это довольно просто

Run("C:\test\batchfile.bat", "", @SW_HIDE)

Если вы хотите запустить его в цикле,

$x=0
Do
 Run("C:\test\batchfile.bat", "", @SW_HIDE)
 Sleep(5000)
Until $x = 1

Скомпилируйте его как .exe - и все готово.


Аналогично, в AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
Адриан Йео
источник
5

Используйте скрытый старт (стоит $ 20)

Скрытый запуск - запуск приложений и пакетных файлов без консольного окна или запроса UAC

Консольные приложения и командные файлы регулярно запускаются при запуске Windows или по расписанию. Основным неудобством этого является то, что каждое приложение открывает консольное окно, которое мерцает на экране. Скрытый запуск (или Hstart) - это облегченная утилита командной строки, которая позволяет запускать консольные приложения и пакетные файлы без какого-либо окна в фоновом режиме, обрабатывать повышение привилегий UAC в Windows 7 и Vista, запускать несколько команд параллельно или синхронно и многое другое. ,

введите описание изображения здесь

Кайл А
источник
Это очень красиво разработанное и полезное приложение.
Гуру Джош
5

Простое решение, без использования каких-либо дополнительных программ.

  1. Создайте пакетный файл, который вы хотите выполнить, и протестируйте его.
  2. Создайте ярлык для него.
  3. Отредактируйте свойства ярлыка: на вкладке «Ярлык» выберите «Запустить свернутый». Назначьте ему горячую клавишу, и все готово!

Удачи!

Willem
источник
7
Это не решение проблемы ОП. Есть разница между минимизацией и сокрытием
nixda
Если вы измените ярлык на правильный значок, минимизированный всплеск на панели задач станет хорошим напоминанием о том, что что-то начинается.
Кто бы ни был
Это хорошее и чистое решение для моей проблемы! Спасибо!
dmitry_romanov
сводя к минимуму ... хе-хе.
gumuruh