如何运行Windows批处理文件但隐藏命令窗口?我不希望cmd.exe在执行文件时在屏幕上可见。这可能吗?
答案 0 :(得分:39)
如果您编写非托管程序并使用CreateProcess API,则应初始化STARTUPINFO类型的lpStartupInfo
参数,以便wShowWindow
字段该结构的结构为SW_HIDE,并且不要忘记在STARTUPINFO的STARTF_USESHOWWINDOW
字段中使用dwFlags
标记。另一种方法是使用dwCreationFlags
参数的CREATE_NO_WINDOW标志。同样的技巧也适用于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
一样。
您可以使用以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文件编译为可执行文件。
步骤:
答案 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