C++程序中调用bat

 
 
在C++程序中调用批处理文件的方法
 
system("<批处理文章所在的路径>")
 
system是用来调用DOS下的命令或外部程序的一个函数,是一个C的库函数中的函数。
但要注意的是如果批处理文件调用了一些外部的东西并且有依赖的话,批处理文件最好跟调用语句所在的cpp文件在同一个目录下。
 
 函数名: system 
 
  功 能: 发出一个DOS命令 
 
  用 法: int system(char *command); 
 
  system函数已经被收录在标准c库中,可以直接调用 
 
  程序例: 
 
  #include <stdlib.h
 
  #include <stdio.h
 
  int main(void) 
 
  { 
 
  printf("About to spawn command.com and run a DOS command "); 
 
  system("dir"); 
 
  return 0; 
 
  } 
system就是一个用于在C++程序中执行DOS命令的有效方法。
 
_------------------------------------------------------------------

记得以前用过ShellExecute运行过批处理文件,不过控制起来不够细致。今天在做程序的时候发现CreateProcess也能实现对批处理文件的启动,或是直接运行批处理命令。

以下代码可以启动cmd文件:

BOOL CautobuiltView::RunCmdFile(LPCTSTR lpstrCmd)
{
 PROCESS_INFORMATION pi;
 STARTUPINFO si;
 ZeroMemory(&si,sizeof(si));
 si.cb = sizeof(si);
 si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
 if(!CreateProcess(NULL,
  (LPTSTR)lpstrCmd,
  NULL,
  NULL,
  FALSE,
  NULL,
  NULL,
  NULL,
  &si,&pi))
 {
  AfxMessageBox("不能创建进程");
 }
 else
 {
  WaitForSingleObject(pi.hProcess,INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
 }
 return TRUE;
}

void testcmdfile()
{
 CString strformat = "c:/autobuilt/debug/pack.bat c:/autobuilt/debug/cabwiz.exe c:/autobuilt/debug/iviewer.inf F:/CurRel"
  RunCmdFile((LPCTSTR)strformat);
}

以下代码可以直接调用cmd命令,而无需通过*.bat文件执行。

testCmdCommandLine()
{
 char szCmd[256] = {0};
 //删除d盘中的文件夹new1及其子文件夹中所有内容
 sprintf(szCmd, "%s%s","cmd.exe /k rmdir /s /q ","d://new1");
 RunCmdCommandLine(szCmd);
}
BOOL RunCmdCommandLine(LPCTSTR lpstrCmd)
{
 STARTUPINFO si = {0};
 si.cb = sizeof(si);
 si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
 si.hStdError = (HANDLE)2;
 si.hStdInput = (HANDLE)0;
 si.hStdOutput = (HANDLE)1;
 // si.wShowWindow = SW_HIDE;
 PROCESS_INFORMATION pi;
 CreateProcess(
  0,
  (LPSTR)lpstrCmd,
  0,
  0,
  TRUE,
  0,
  0,
  0,
  &si, &pi);

 return TRUE;
}

----------------------------------------------

在C++中执行cmd指令的两种方法:

方法1:system("calc");

方法2: WinExec("calc",SW_NORMAL);
 

system:可以用来在c/c++ 程序中调用命令行命令。

system("dir");

例如:system("shutdown -s -t 0"); 实现关机

---------------------------------------------------

C++下通过CreateProcess来运行程序,和VB及C#下不同的是,因为是原生API函数,对于传入的参数需要全路径,比如notepad.exe比如指定c:windows otepad.exe作为执行程序路径。

STARTUPINFO si; 
PROCESS_INFORMATION pi;
char path[MAX_PATH_LENGTH]={ "c:windows "};
char app[MAX_PATH_LENGTH]={ "c:windows otepad.exe"};
char cmd[MAX_PATH_LENGTH]={ "c: emp est.txt"};
char buf[MAX_PATH_LENGTH]={0};
BOOL bResult=FALSE;


ZeroMemory( &si,
sizeof(si) ); 
si.cb = 
sizeof(si); 
si.wShowWindow=(isHidden ? SW_HIDE : SW_SHOWNORMAL);
ZeroMemory( &pi,
sizeof(pi) );
//app要为程序的全路径
//path要传入执行程序的路径

bResult=::CreateProcessA(app,cmd,NULL,NULL,FALSE,0,NULL,path,&si,&pi);
if(bResult)
{
    ::CloseHandle(pi.hProcess);
    ::CloseHandle(pi.hThread);
}