如何运行Windows批处理文件但隐藏命令窗口?

时间:2010-09-09 14:56:21

标签: windows scripting batch-file

如何运行Windows批处理文件但隐藏命令窗口?我不希望cmd.exe在执行文件时在屏幕上可见。这可能吗?

10 个答案:

答案 0 :(得分:39)

如果您编写非托管程序并使用CreateProcess API,则应初始化STARTUPINFO类型的lpStartupInfo参数,以便wShowWindow字段该结构的结构为SW_HIDE,并且不要忘记在STARTUPINFOSTARTF_USESHOWWINDOW字段中使用dwFlags标记。另一种方法是使用dwCreationFlags参数的CREATE_NO_WINDOW标志。同样的技巧也适用于ShellExecuteShellExecuteEx函数。

如果您编写托管应用,则应遵循http://blogs.msdn.com/b/jmstall/archive/2006/09/28/createnowindow.aspx的建议:使用ProcessStartInfoCreateNoWindow = true初始化UseShellExecute = false,然后将其用作的参数。就像你可以将WindowStyle的属性ProcessStartInfo设置为ProcessWindowStyle.Hidden而不是CreateNoWindow = true一样。

可以使用以wcsript.exe开头的VBS脚本。在脚本中,您可以使用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始终工作)非常重要。这对于从上面列出的启动隐藏批次的变体中的任何使用都很重要。

答案 1 :(得分:8)

使用C#,无需打开窗口即可轻松启动批处理命令。 看看下面的代码示例:

        Process process = new Process();
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.FileName = "doSomeBatch.bat";
        process.Start();

答案 2 :(得分:5)

对于任何可执行文件,您可以使用带有“c”参数的cmd运行程序:

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

( - >如果它是批处理文件!)作为最终解决方案,我建议您创建一个.cmd文件并将此命令放入其中:

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

现在运行此.cmd文件。

答案 3 :(得分:4)

Here 我已经编译了我所知道的所有方法,无需外部工具即可使用批处理启动隐藏进程。使用随时可用的脚本(其中一些包含丰富的选项),所有这些都可以形成命令行。还可以返回PID。使用的工具是IEXPRESS,SCHTASKS,WScript.Shell,Win32_Process和JScript.Net - 但所有这些工具都包含在.bat文件中。

答案 4 :(得分:2)

Oleg答案的原生C ++编码版本 - 根据Boost软件许可证从a project I work on复制/粘贴。

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 );

答案 5 :(得分:2)

来自technet的这个小VBScript可以解决问题:

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,然后运行它。

Doc说它没有在Win7中测试过,但我刚测试过,它运行正常。不会为您运行的任何流程显示任何窗口

答案 6 :(得分:0)

您可以编写一个除了执行批处理文件之外什么都不做的Windows服务。由于服务在自己的桌面会话中运行,因此用户将无法看到命令窗口。

答案 7 :(得分:0)

使用bat并选择right-click,为Create shortcut文件创建快捷方式。  您创建的快捷方式上的Right-click,然后点击属性。 单击“运行”下拉框并选择“最小化”。

答案 8 :(得分:0)

使用Bat To Exe Converter并将Bat文件编译为可执行文件。

步骤:

  1. 打开Bat to Exe Converter
  2. 选择您的Bat文件
  3. 在选项中选择&#34; Invisible Application&#34;
  4. 按下编译按钮
  5. 完成

答案 9 :(得分:-1)

1,下载bat to exe转换器并安装它 2,运行bat to exe应用程序 3,如果你想制作好看的exe,请下载.pco图片 4,指定bat文件位置(c:\ my.bat) 5,指定保存exe的位置(例如:c:/my.exe) 6,选择版本信息选项卡 7,选择图标文件(下载.pco图片) 8,如果你想填写版本,comapny名称等信息 9,将选项卡更改为选项 10,选择不可见的应用程序(这将在运行应用程序时隐藏命令提示符) 11,选择32位(如果选择64位exe只能在32位OS中工作) 12,编译 13,将exe复制到bat文件正确执行的位置 14,运行exe