传奇继续......
我在网上搜索过,我已经在StackOverflow上搜索过,我发现很多希望给出答案/解决方案,但不知何故他们都失败了(包括与ShellExecute相关的那些(Ex) ))。
如何使用CreateProcess隐藏(闪烁)CMD窗口(包括参数)
我基本上想要调用/执行一组条件/本机cmd.exe
命令(即FOR /F
和||
),还要调用/执行外部命令FIND(STR).exe
。而且,没有显示(闪烁)CMD窗口。
但即使隐藏像"cmd.exe /C ECHO ...flashing window is bad..."
这样简单的事情似乎也无法做到。
我尝试过的代码(包括与dwFlags
和wShowWindow
标记相关的许多变体
#include <windows.h>
int main()
{
char cmdline[] = "cmd.exe /c ECHO ...flashing window is bad...";
PROCESS_INFORMATION pi;
STARTUPINFO si;
// memset(&si,0,sizeof(STARTUPINFO));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
// si.dwFlags = STARTF_USESTDHANDLES;
// si.dwFlags = CREATE_NO_WINDOW;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
// si.wShowWindow = CREATE_NO_WINDOW;
CreateProcess(NULL, (LPSTR) cmdline, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
// ExitProcess;
return 0;
}
我不想依赖外部程序,即.vbs(Windows Scripting Host)或快捷方式,但只是一个独立的编译.exe。
这是(真的)要求太多,还是我(完全)错了?
感谢...
答案 0 :(得分:1)
更新:您似乎也将CreateProcess
标志(其dwCreationFlags
参数)与STARTUPINFO
结构的成员混淆。这些是不同的标记,CREATE_NO_WINDOW
不应位于STARTUPINFO
。
您必须传递CREATE_NO_WINDOW
标志,然后控制台窗口才会显示。最初我回答说你必须重新定位不正确的标准手柄(但仍然强烈推荐)。
设置STARTF_USESTDHANDLES
并填写适当的句柄。如果您对流程的输出感兴趣,请创建管道,否则您只需打开nul
通道即可。
答案 1 :(得分:0)
尝试使用ProcessBuilder。这是一个我有一些代码似乎工作得很好的代码示例。在下面的代码中,shellScript是我动态创建的StringBuilder,它包含我想要执行的命令及其参数。
String[] scriptArray = shellScript.toString().split(" ");
ProcessBuilder builder = new ProcessBuilder(scriptArray);
File outputFile = new File("/logs/AgentOutputLog.txt");
File errorFile = new File("/logs/AgentErrorLog.txt");
builder.redirectOutput(outputFile);
builder.redirectError(errorFile);
Process process = builder.start();
int errCode = process.waitFor();
//errCode = 0 means online
if(errCode == 0){
success = true;
break;
//errCode = 1 means offline
} else if (errCode == 1){
success = false;
break;
}