Запустите командный файл полностью скрытым способом

139

Я ищу какой-нибудь способ запуска командного файла (.bat) без чего-либо видимого пользователю (без окна, без имени панели задач, .etc ..).

Я не хочу использовать какую-то программу для этого, я ищу что-то более чистое. Я нашел решение, которое использует VBScript, но я также не очень люблю использовать VBScript.

Мояд Мардини
источник
Ха - ха! Точно нет. Я разрабатываю службу Windows, которая время от времени будет запускать командный файл.
Моаяд Мардини
4
Службы Windows не запускаются как командные файлы. Они работают как сервисы. Вам нужно уточнить вопрос - как написано, так и с комментариями это не имеет смысла для меня.
CarlF
1
У меня есть служба Windows, которая запускает пакетные файлы. Не то, чтобы сервис был командным файлом.
Моаяд Мардини
1
На каком языке вы пишете свои услуги?
Хью Аллен
там тоже есть старт.
Барлоп

Ответы:

119

Решение 1:

Сохраните эту одну строку текста как файл invisible.vbs:

CreateObject ("Wscript.Shell"). Выполнить "" "" & WScript.Arguments (0) & "" "", 0, False

Чтобы запустить любую программу или командный файл незаметно, используйте его следующим образом:

wscript.exe "C: \ Wherever \ invisible.vbs" "C: \ Some Other Place \ MyBatchFile.bat"

Чтобы также иметь возможность передавать / передавать список аргументов, используйте только две двойные кавычки

CreateObject ("Wscript.Shell"). Run "" & WScript.Arguments (0) & "", 0, False

Пример: Invisible.vbs "Kill.vbs ME.exe"

Решение 2:

Используйте инструмент командной строки для автоматического запуска процесса: Quiet , hidecon или hideexec .

harrymc
источник
2
Почему 4 двойные кавычки, не могли бы вы объяснить?
Starx
Что если нам нужно запустить скрытую программу?
Старкс
5
Синтаксис @Starx VB. &означает конкатенацию строк. Строки заключены в двойные кавычки ( "). Последовательные двойные кавычки ( "") внутри разделителей строк означают буквальную двойную кавычку ( "). Таким образом, четыре двойных кавычки ( """") будут строковым литералом одного символа, двойной кавычкой ( "). Сложите это вместе, и """" & WScript.Arguments(0) & """"станет "<argument>", где <argument>первый аргумент командной строки передается в сценарий.
Боб
4
Как изменить его так, чтобы он передавал все аргументы? Было бы удобнее передать аргументы без их цитирования.
Ctrl-C
2
Разве это не требует от вас создания командного файла для размещения wscript.exe "C:\Wherever\invisible.vbs" ...внутри?
эндолиты
26

Чтобы скрыть пакетные файлы или командные файлы или любые файлы .... Используйте встроенную IExpress.exeутилиту Windows XP для создания .EXE из пакетного файла. При использовании IExpressубедитесь, что вы отметили опцию Run hidden и отметили все поля, чтобы ничего не показывать. После того, как вы создадите .exe-файл, поместите его в любую папку команд запуска, которую вы выберете, и вы никогда не увидите, что она появится.

Пол Чесельске
источник
1
О, хорошее решение на самом деле.
Камило Мартин
7
Есть ли что-нибудь эквивалентное lexpress.exe в новых версиях Windows, таких как Windows 7?
Sнаđошƒаӽ
@ Sнаđошƒаӽ Это в Windows 7 .... только что проверил
DarthRubik
@DarthRubik Спасибо, что поделились этим. Я тоже это проверил, и он работает просто отлично. Время поднять ответ. :)
Sнаđошƒаӽ
Похоже, что это не работает на Windows 10 64, так как «Command.com» больше не существует
Arne S
10

использовать Cmdow - это утилита командной строки Win32 для NT4 / 2000 / XP / 2003, которая позволяет перечислять, перемещать, изменять размер, переименовывать, скрывать / скрывать, отключать / включать, минимизировать, максимизировать, восстанавливать, активировать / инактивировать, закрывать, убивать и закрывать окна. Больше.

Запустите скрытый пакетный файл, передав ему параметры: -

cmdow / run / hid mybat arg1 "arg 2"

Джо
источник
Но как мне запустить эту команду?
Моаяд Мардини
9
cmdow определяется как вредоносное ПО большинством антивирусных продуктов. Следовательно, было бы трудно использовать это решение в местах, отличных от вашего ПК.
Ганеш Р.
@ Ганеша: есть лучшее решение?
Моаяд Мардини
Это с открытым исходным кодом? Нет смысла использовать стороннее приложение, которое не является открытым исходным кодом и может упаковывать трояны, когда вы можете сделать то же самое, запустив 1-строчный vbscript для harrymc (см. Ответ в верхней части цепочки).
thebunnyrules
1
Ну, это с открытым исходным кодом, так что это довольно здорово. Можете получить исходный код здесь: github.com/ritchielawrence/cmdow
thebunnyrules
9

Если ваш пакетный файл может уместиться в одну строку и так много символов, просто используйте ярлык, щелкнув правой кнопкой мыши внутри папки, помещенной в случайный каталог, и пропустив оставшуюся часть мастера, и, наконец, щелкните правой кнопкой мыши на только что созданном ярлыке и щелкните свойства и под целевой введите то, что вы обычно помещаете в файл bat. И Бобс твой дядя!

Плюсы:

 No Command Window
 Ability to use an icon
 Same Functionality of bat file

Минусы:

 Limited to one line, so many characters
Джек С
источник
Единственная проблема заключается в том, что вы не можете связать тип файла с ярлыком. Поэтому, если вы хотите открыть пакетный скрипт, дважды щелкнув по нему в проводнике, вам все равно нужен .bat-файл.
Бьорн Линдквист
Я все еще пытаюсь найти дядю Боба, он где-то здесь!
Сок Pimp IT
7

Запустите скрипт через задание at, не делая его интерактивным:

at 11:00 script.bat

Другое решение, если вы не возражаете против установки чего-то вроде Python, вы можете просто создать скрипт и запустить его с pythonw(связанная версия для операций с графическим интерфейсом). Поскольку вы не используете какие-либо графические API, окно не будет отображаться. Просто используйте вызовы, os.system()и он будет имитировать пакетный скрипт, так же, как и ввод строк в командной строке.

Пример:

import os

os.system("tasklist > C:\tasks.txt")
os.system("ipconfig /all > C:\netinfo.log")
Джон Т
источник
3
Но как мне запустить эту команду?
Моаяд Мардини
Вам нужно будет либо запланировать запланированное задание, либо написать сервис.
unundednut
примеры добавлены.
Джон Т
6

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

start /MIN batch.cmd
Брэд Гилберт
источник
3
или используйте / B вместо этого!
Ран
6

Используя Windows7, вы можете использовать панель управления «Запланированная задача», чтобы запланировать запуск пакетного файла незаметно в фоновом режиме с указанными разрешениями и даже в качестве учетной записи «SYSTEM». Смотрите скриншот ниже:

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

Более того, несмотря на не так много возможностей, вы также можете создать задачу невидимого пакетного сценария, подобную этой, из командной строки, используя команду «AT.exe» без опции «/ interactive».

djangofan
источник
3
Скрытый флажок просто скрывает задачу из пользовательского интерфейса планировщика задач (
Сурав Гхош
Запускать задачу как «СИСТЕМА», когда ей не нужны привилегии «СИСТЕМЫ» (и которая не проверялась на предмет слабых мест в системе безопасности и не закалялась), как плохая идея; смотрите комментарии здесь .
Скотт
6

Мне не нравится решение VBScript.

Загрузите и скопируйте файл nircmd.exe в свою %systemroot%\system32папку, затем добавьте эту команду в первую строку пакета:

nircmd.exe win hide ititle "cmd.exe"

или сначала настройте заголовок пакета с помощью titleкоманды, чтобы избежать скрытия всех cmdокон, например:

title MyBatch
nircmd.exe win hide ititle "MyBatch"
Bijan-R,
источник
Я использую этот точный метод, но в течение некоторого времени не получалось, что nircmd не скрывает окно cmd, просто свернуто в панель задач и не может быть восстановлено нажатием на него. Не знаю, почему ...
Джеймс Ян
3

Вы также можете создать скрипт AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
эндолиты
источник
3

И ДРУГОЙ способ, из C / C ++, это использовать функцию CreateProcess с флагом CREATE_NO_WINDOW. Это имеет много дополнительной мощности, не показанной здесь. Это как минимум тот минимум, который вам необходим для замены system () или семейства _spawn ().

STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);

PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );

// Spawn creates a cmd.exe window.  CreateProcess doesn't.
//if ( _spawnl( _P_WAIT, szFileNameBAT, szFileNameBAT, NULL ) ) {  
if ( !CreateProcess( szFileNameBAT, szFileNameBAT, NULL, NULL, false,
                     CREATE_NO_WINDOW, NULL, NULL, &si, &pi  ) ) {
  MyErrorFunc( "CreateProcess( \"%s\" ): %d", szFileNameBAT, GetLastError() );
  goto MyErrorHandling;
}

WaitForSingleObject( pi.hProcess, INFINITE );

CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
Швейцарский франк
источник
1
Правильный ответ для подхода WINAPI. Вот исходный код и приложение как дополнение к вашему ответу.
Алекс
3

Превосходный Конвертер Bat To Exe конвертирует ваш файл .batили .cmdфайл в .exeфайл.

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

Вот скриншот главного окна интерфейса:


Обратите внимание, что это изображение устарело. Он показывает версию 2.4.8, и по состоянию на сентябрь 2018 года веб-сайт предлагает версию 3.0.10.0 (последнее обновление 2018-03-23).

Предупреждение: на веб-сайт www.f2ko.de ссылаются coinhive.com, что широко определяется как вредоносное ПО .

BullyWiiPlaza
источник
2

Я сделал это успешно с nircmd следующим образом:

  1. скачайте nircmd.exe по ссылке
  2. создайте свой .bat файл
  3. первая строка .bat файла должна быть такой: nircmd.exe win hide ititle "cmd.exe"
  4. выберите оба файла и создайте самораспаковывающийся файл, используя winrar
  5. на вкладке «Общие» установите флажок «Создать файл автоэкстракции».
  6. во вкладке «аванс» выберите кнопку «автоэкстракт»
  7. Появится новое окно и выберите вкладку «Режим», затем выберите опцию: «Скрыть все»
  8. выберите вкладку «обновить» и выберите опцию «перезаписать существующие файлы»
  9. Выберите вкладку «Общие» и определите папку назначения для извлечения, если хотите, и в поле «Excecute after extract» напишите полный путь, куда будет извлечен ваш .bat. Пример: если вы определите папку для извлечения как: "c: \ windows \", тогда полный путь к excute после извлечения будет: "c: \ windows \ file.bat" (в случае, если ваш .bat называется: file.bat )
  10. нажмите принять во всех окнах

Теперь у вас будет файл .exe, который после того, как вы нажмете на него и установите, ваш .bat будет полностью скрыт.

ЗЕВС
источник
1
cmdow /run /hid "file.extention" arg1 "arg 2"
Малак
источник
3
Пожалуйста, включите краткое объяснение команды. Это может помочь ОП (и другим) понять, как это работает, а не просто копировать команду и использовать ее.
BloodPhilia
'cmdow' is not recognized as an internal or external command, operable program or batch file.
Bacco
1

Вам не нужно делать ничего особенного.

Если вы запускаете пакетные файлы из службы Windows, они должны быть скрыты по умолчанию, если вы не включите в службе параметр «Разрешить службе взаимодействовать с рабочим столом».

sgmoore
источник
1

Добавив мой ответ сюда из другого поста, поскольку он был дубликатом, и я не вижу здесь этого решения, так что теперь есть 17 различных ответов о том, как вы можете запустить скрытый пакетный файл. Я удалю свой ответ на этот пост в какой-то момент в ближайшем будущем.

Создайте свой пакетный сценарий с вашей пакетной логикой и командами в нем, а затем создайте новый файл с .VBSрасширением, используйте приведенную ниже логику (пример, который я привел ниже) и просто подключите полный путь к вашему файлу .CMDили .BATфайлу с помощью PING -t <IPAddress>команд и т. Д., Так он выполняет пакет скрытно, не показывая командное окно при его выполнении.

Где логика в приведенном ниже примере указывает на C:\Folder\BatchFileName.cmdизменение, чтобы оно указывало на пакетный скрипт с вашими командами, которые вы выполняете вручную и т. Д. Сейчас.

Сохраните .VBSфайл и запланируйте его с помощью Task Scheduler задач «Планирование задачи» на Windows7 для выполнения в неопределенное время для ваших нужд.

В противном случае, просто дважды щелкните по .VBSфайлу, чтобы запустить бесконечную PINGкоманду, которую вы поместили в командный файл, на который вы указываете при необходимости.

ПРИМЕЧАНИЕ. Я полагаю, что именно здесь я получил эту логику сценария, но она надежно работает для той же цели, что и здесь, а именно для обеспечения того, чтобы командное окно было скрыто при запуске командного файла. Источник сбоя сервера

ПРИМЕР VBS SCRIPT RUN КОМАНДНАЯ СТРОКА, ЗАКРЫВАЮЩАЯ ОКНО CMD

Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Folder\BatchFileName.cmd" & Chr(34), 0
Set WinScriptHost = Nothing
Сок Pimp IT
источник
1

Здесь я скомпилировал все известные мне способы запуска скрытого процесса с помощью пакета без внешних инструментов. С готовыми к использованию сценариями (некоторые из них довольно богаты опциями), и все они образуют командную строку. Возвращается PID. Используемые инструменты: IEXPRESS, SCHTASKS, WScript.Shell, Win32_Process и JScript.Net

npocmaka
источник
1

Несмотря на то, что я уже ответил на это, вот другой подход. Различия здесь в том, что пакетный скрипт может самостоятельно скрывать себя во время своего запуска. Вам понадобятся два дополнительных скрипта - windowMode.bat и getCMDPid.bat (оба содержат .netкод). Вот как тогда можно использовать:

@echo off
call getCmdPid
call windowMode -pid %errorlevel% -mode hidden

echo this should be written into log despite the cmd window is hidden>log
echo ending the log>>log
exit
npocmaka
источник
0

У меня была такая же проблема, но разобрался:
Shell("filehere" & "parametersforbatchfilehere", vbHidden)

Алан Панайотов
источник
0

Я начал пытаться понять это и никогда не получалось. Это было так близко, как я получил:

@echo off
if not defined PIL (
    set PIL=1
    start /min "" %~0
    exit /b
)
TITLE Hello World
echo Hello world!
pause>nul
djangofan
источник
0

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

У меня было это в реестре "команда" для контекстного меню проводника:

cmd /c C:\mypath\myprogram.bat "%1"

Таким образом, чтобы заменить его, я должен был создать VBS, как это:

WScript.CreateObject ("WScript.shell").run "cmd /c C:\mypath\myprogram.bat """ & WScript.Arguments(0) & """", 0, False

Сохраните в таком месте C:\mypath\myscript.vbsи назовите его в реестре следующим образом:

wscript "C:\mypath\myscript.vbs" "%1"

Обратите внимание, что путь .bat не может содержать пробелов, поэтому замените его именем файла 8.3. Так, например, C:\Program Files\myprogram.batдолжны быть ссылки как C:\Progra~1\myprogram.bat. Для просмотра имени файла 8.3 используйтеdir /x

bortao
источник
0

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

Конфиг, как показано ниже:

файл: config.arg

:style:hidden

MyBatchFile.bat
arg1
arg2

И запустить runapp.exeвместо.

Джеймс Ян
источник
-1

Это работает для Windows 8 (возможно, другие)

  1. Создайте командный файл как обычно
  2. Создать ярлык для командного файла
  3. Щелкните правой кнопкой мыши на ярлык> свойства
  4. Нажмите Макет
  5. Снимите флажок «Разрешить системное положение окна»
  6. установить левое положение tp -1000
  7. нажмите применить

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

Андрей
источник
4
В самом деле? Это не будет отображаться как кнопка на панели задач?
Скотт