Как я могу запустить командный файл Windows, но скрыть окно команд? - PullRequest
30 голосов
/ 09 сентября 2010

Как запустить командный файл Windows, но скрыть командное окно?Я не хочу, чтобы cmd.exe был виден на экране во время выполнения файла.Возможно ли это?

Ответы [ 10 ]

39 голосов
/ 13 сентября 2010

Если вы пишете неуправляемую программу и используете CreateProcess API, вам следует инициализировать lpStartupInfo параметр типа STARTUPINFO , чтобы wShowWindow поле структура SW_HIDE и не забудьте использовать флаг STARTF_USESHOWWINDOW в поле dwFlags STARTUPINFO . Другой способ - использовать CREATE_NO_WINDOW флаг параметра dwCreationFlags. Тот же прием работает и с функциями ShellExecute и ShellExecuteEx .

Если вы пишете управляемое приложение , вам следует следовать советам из http://blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx:, инициализировать ProcessStartInfo с CreateNoWindow = true и UseShellExecute = false, а затем использовать в качестве параметра. Точно так же, как в случае, если вы можете установить свойство WindowStyle из ProcessStartInfo в ProcessWindowStyle.Hidden вместо или вместе с CreateNoWindow = true.

Вы можете использовать VBS-скрипт , который вы запускаете с помощью wcsript.exe. Внутри скрипта вы можете использовать CreateObject("WScript.Shell") и затем Run с 0 в качестве второго (intWindowStyle) параметра. См. http://www.robvanderwoude.com/files/runnhide_vbs.txt в качестве примера. Я могу продолжить с Kix, PowerShell и т. Д.

Если вы не хотите писать какую-либо программу, вы можете использовать любую существующую утилиту , например CMDOW / RUN / HID "c: \ SomeDir \ MyBatch.cmd" , hstart / NOWINDOW / D = c: \ scripts "c: \ scripts \ mybatch.bat" , hstart / NOCONSOLE "batch_file_1.bat" , которые делают то же самое. Я уверен, что вы найдете гораздо больше таких бесплатных утилит.

В некоторых сценариях (например, начиная с UNC-пути ) важно также установить рабочий каталог на некоторый локальный путь (%SystemRoot%\system32 работает всегда). Это может быть важно для использования любого из перечисленных выше вариантов запуска скрытой партии.

8 голосов
/ 16 сентября 2010

Используя C #, очень легко запустить пакетную команду без открытого окна. Посмотрите на следующий пример кода:

        Process process = new Process();
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.FileName = "doSomeBatch.bat";
        process.Start();
5 голосов
/ 13 сентября 2010

Для любого исполняемого файла вы можете запустить вашу программу, используя cmd с параметром "c":

cmd /c "your program address"\"YourFileName".bat  

(-> если это командный файл!) В качестве окончательного решения я предлагаю вам создатьфайл .cmd и поместите в него следующую команду:

cmd /c "your program address"\"YourFileName".bat
exit

Теперь просто запустите этот файл .cmd.

4 голосов
/ 03 февраля 2015

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

2 голосов
/ 17 сентября 2010

Этот маленький VBScript из technet делает свое дело:

Const HIDDEN_WINDOW = 12

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")

Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = HIDDEN_WINDOW
Set objProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
errReturn = objProcess.Create("mybatch.bat", null, objConfig, intProcessID)

Отредактируйте mybatch.bat к имени вашего файла bat, сохраните как vbs, запустите его.

Док говорит, что он не тестировался в Win7, но я только что протестировал, он работает нормально.Не будет отображаться окно для любого запускаемого вами процесса

2 голосов
/ 13 сентября 2010

Родная C ++ кодированная версия ответа Олега - это копия / вставка из проекта, над которым я работаю по лицензии Boost Software.

BOOL noError;
STARTUPINFO startupInfo;
PROCESS_INFORMATION processInformation;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_HIDE;
noError = CreateProcess(
    NULL,                                           //lpApplicationName
    //Okay the const_cast is bad -- this code was written a while ago.
    //should probably be &commandLine[0] instead. Oh, and commandLine is
    //a std::wstring
    const_cast<LPWSTR>(commandLine.c_str()),        //lpCommandLine
    NULL,                                           //lpProcessAttributes
    NULL,                                           //lpThreadAttributes
    FALSE,                                          //bInheritHandles
    CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT,  //dwCreationFlags
    //This is for passing in a custom environment block -- you can probably
    //just use NULL here.
    options.e ? environment : NULL,                 //lpEnvironment
    NULL,                                           //lpCurrentDirectory
    &startupInfo,                                   //lpStartupInfo
    &processInformation                             //lpProcessInformation
);

if(!noError)
{
    return GetLastError();
}

DWORD exitCode = 0;

if (options.w) //Wait
{
    WaitForSingleObject(processInformation.hProcess, INFINITE);
    if (GetExitCodeProcess(processInformation.hProcess, &exitCode) == 0)
    {
        exitCode = (DWORD)-1;
    }
}

CloseHandle( processInformation.hProcess );
CloseHandle( processInformation.hThread );
0 голосов
/ 03 апреля 2017

1, скачайте конвертер bat в exe и установите его 2, запустить летучую мышь, чтобы exe-приложение 3, Загрузите изображения .pco, если вы хотите сделать хорошо выглядящий exe 4, укажите местоположение файла bat (c: \ my.bat) 5. Укажите местоположение для сохранения исполняемого файла (например, c: /my.exe). 6, выберите вкладку Информация о версии 7, выберите файл значка (загруженное изображение .pco) 8, если вы хотите заполнить информацию, такую ​​как версия, имя компании и т. Д. 9, измените вкладку на вариант 10, выберите невидимое приложение (это будет скрывать командную строку при запуске приложения) 11, выберите 32-битный (если вы выберите 64-битный exe будет работать только в 32-битной ОС) 12, Compile 13, скопируйте исполняемый файл в место, где файл bat выполняется правильно 14, запустите exe

0 голосов
/ 17 января 2017

Используйте Bat To Exe Converter и скомпилируйте файл Bat в качестве исполняемого файла.

Шаги:

  1. Откройте Bat to Exe Converter
  2. Выберите свой файл Bat
  3. В опциях выберите "Невидимое приложение"
  4. Готово, нажав кнопку компиляции
0 голосов
/ 12 мая 2016

Создайте ярлык для файла bat, используя right-click и выбрав Create shortcut. Right-click на ярлык, который вы создали, и нажмите на свойства. Щелкните раскрывающийся список «Выполнить» и выберите «Свернутый».

0 голосов
/ 12 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...