繁体   English   中英

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

[英]How can I run a windows batch file but hide the command window?

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

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

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

可以使用以 wcsript.exe 开头的 VBS 脚本 在脚本中可以使用CreateObject("WScript.Shell")然后运行以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始终工作)。 这对于使用上面列出的启动隐藏批处理的任何变体都很重要。

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

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

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

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

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

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

现在只需运行这个 .cmd 文件。

要自我隐藏已经运行的脚本,您需要getCmdPid.batwindowoMode.bat

@echo off

echo self minimizing
call getCmdPid.bat
call windowMode.bat -pid %errorlevel% -mode hidden

echo --other commands--
pause

在这里,我编译了所有我知道的无需外部工具即可使用批处理启动隐藏进程的方法。准备好使用脚本(其中一些具有丰富的选项),并且所有这些都形成命令行。PID 在哪里也可能返回。使用的工具是 IEXPRESS、SCHTASKS、WScript.Shell、Win32_Process 和 JScript.Net - 但它们都包含在.bat文件中。

Oleg 答案的本机 C++ 编码版本——这是从在 Boost 软件许可证下工作的项目中复制/粘贴的。

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

这个来自technet 的小 VB​​Script 可以解决这个问题:

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 中测试,但我只是测试了它,它工作正常。 不会为您运行的任何进程显示任何窗口

您可以编写一个只执行批处理文件的 Windows 服务。 由于服务在它们自己的桌面会话中运行,因此用户将看不到命令​​窗口。

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

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

步骤:

  1. 打开 Bat to Exe 转换器
  2. 选择您的 Bat 文件
  3. 在选项中选择“隐形应用程序”
  4. 按编译按钮完成

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM