如何在运行Windows批处理文件时隐藏命令窗口?当文件正在执行时,我不希望cmd.exe出现在屏幕上可见。是否有可能实现这个目标?
如何在运行Windows批处理文件时隐藏命令窗口?当文件正在执行时,我不希望cmd.exe出现在屏幕上可见。是否有可能实现这个目标?
lpStartupInfo
参数,以便结构体的 wShowWindow
字段为 SW_HIDE,并且不要忘记在 STARTUPINFO 的 dwFlags
字段中使用 STARTF_USESHOWWINDOW
标志。另一种方法是使用 dwCreationFlags
参数的 CREATE_NO_WINDOW 标志。相同的技巧也适用于 ShellExecute 和 ShellExecuteEx 函数。CreateNoWindow = true
和UseShellExecute = false
初始化ProcessStartInfo
,然后将其作为参数传递。就像在设置属性ProcessStartInfo
的WindowStyle
为ProcessWindowStyle.Hidden
或与CreateNoWindow = true
一起使用的情况下一样。CreateObject("WScript.Shell")
,然后使用0作为第二个(intWindowStyle
)参数来运行Run。请参见http://www.robvanderwoude.com/files/runnhide_vbs.txt作为示例。我可以继续使用Kix、PowerShell等等。%SystemRoot%\system32
始终有效)也很重要。这对于使用上述列出的任何隐藏批处理变体都很重要。 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
@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 );
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中未经过测试,但我刚刚测试过了,它可以正常工作。无论您运行什么进程,它都不会显示任何窗口。
通过使用右键单击
并选择创建快捷方式
,为您的bat
文件创建一个快捷方式。
右键单击
您创建的快捷方式,然后点击属性。
点击运行下拉框,选择最小化。
使用Bat To Exe Converter并将Bat文件编译为可执行文件。
步骤:
你可以编写一个 Windows 服务,仅用于执行批处理文件。由于服务在自己的桌面会话中运行,因此用户看不到命令窗口。
1、下载批处理文件转换成可执行文件的工具并安装。 2、运行批处理文件转换成可执行文件的应用程序。 3、如果想要制作外观良好的可执行文件,则下载 .pco 图像文件。 4、指定批处理文件的位置(例如:c:\my.bat)。 5、指定可执行文件保存的位置(例如:c:/my.exe)。 6、选择版本信息选项卡。 7、选择图标文件(下载的 .pco 图像文件)。 8、如果需要,填写版本、公司名称等信息。 9、切换到选项选项卡。 10、选择隐藏应用程序(这将在运行应用程序时隐藏命令提示符)。 11、选择 32 位(如果选择 64 位,可执行文件仅适用于 32 位操作系统)。 12、编译。 13、将可执行文件复制到批处理文件正确执行的位置。 14、运行可执行文件。