在C下執行DOS命令

a. system("md c://12");

       1) 調用命令時會出現一個dos窗口一閃而過,影響視覺效果。

       2 )無法將命令的執行結果反饋給用戶。

b. WinExec("Cmd.exe /C md c://12", SW_HIDE);

    WinExec的作用是運行指定的程序,其中第一個參數是程序的路徑及參數,第二個參數是定義了以怎樣的形式啓動程序的常數值(詳細請見msdn)。

 

       比如我們要獲得當前目錄下的文件列表,可以這樣

        WinExec("cmd.exe /c dir > result.txt", SW_HIDE);

        執行這行代碼後,將會在當前目錄下生成一個result.txt的文件,文件的內容就是執行dir命令的輸出(注2)。並且不會出現dos窗口(SW_HIDE代表隱藏窗口)

 

       有時候我們需要同時執行數條語句,是不是要執行多次system調用呢?

       答案是否定的,dos自身提供了執行多條命令的功能,符號&&代表同時執行多條命令。

       如“cd C:/demo && dir”會首先將目錄切換到 C:/demo文件夾,然後執行dir命令。

 

       利用&&命令可以實現這樣的功能:暫停等待用戶按下任意鍵,接下來執行某個命令。

       如:pause && dir 會在屏幕上顯示“請按任意鍵繼續”和,在用戶按下任意鍵後會執行dir命令輸出文件列表。

      

       上面利用pause命令實現暫停,但有個副作用:如果用戶不按下鍵盤,程序就會永遠停在那裏。所以我們可以換個命令以實現暫停某段時間後繼續。pause命令是不接受參數的,我們要換另一個命令:ping。可以大家以前也用過ping,不過一般是用來探測網絡信息的吧?這裏用它來實現暫停某段時間:

       “ping -w 3000 w > nul”暫停三秒後繼續(注3)

      

注1:

UINT WinExec(

LPCSTR lpCmdLine,

UINT uCmdShow

);

 

c. ShellExecute

ShellExecute(NULL,"open","d://WINDOWS//system32//cmd.exe","/c md d://zzz","",SW_SHOW);

WinExec主要運行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);  
ShellExecute不僅可以運行EXE文件,也可以運行已經關聯的文件。
首先必須引用shellapi.pas單元:uses ShellAPI;  

1.標準用法  
  ShellExecute函數原型及參數含義如下:  
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;  
  ●hWnd:用於指定父窗口句柄。當函數調用過程出現錯誤時,它將作爲Windows消息窗口的父窗口。例如,可以將其設置爲應用程序主窗口句柄,即Application.Handle,也可以將其設置爲桌面窗口句柄(用GetDesktopWindow函數獲得)。  
  ●Operation:用於指定要進行的操作。其中“open”操作表示執行由FileName參數指定的程序,或打開由FileName參數指定的文件或文件夾;“print”操作表示打印由FileName參數指定的文件;“explore”操作表示瀏覽由FileName參數指定的文件夾。當參數設爲nil時,表示執行默認操作“open”。  
  ●FileName:用於指定要打開的文件名、要執行的程序文件名或要瀏覽的文件夾名。  
  ●Parameters:若FileName參數是一個可執行程序,則此參數指定命令行參數,否則此參數應爲nil或PChar(0)。  
  ●Directory:用於指定默認目錄。  
  ●ShowCmd:若FileName參數是一個可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數應設置爲0。  
  若ShellExecute函數調用成功,則返回值爲被執行程序的實例句柄。若返回值小於32,則表示出現錯誤。  
  上述僅僅是ShellExecute函數的標準用法,下面將介紹它的特殊用法。  

2.特殊用法  
  如果將FileName參數設置爲“http:”協議格式,那麼該函數將打開默認瀏覽器並鏈接到指定的URL地址。若用戶機器中安裝了多個瀏覽器,則該函數將根據Windows 9x/NT註冊表中http協議處理程序(Protocols Handler)的設置確定啓動哪個瀏覽器。  
  格式一:http://網站域名。  
  如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);  
  格式二:http://網站域名/網頁文件名。  
  如:ShellExecute(handle, ‘open’, http:// ;  www.neu.edu.cn/default.htm’,nil,nil,       SW_SHOWNORMAL);  
  如果將FileName參數設置爲“mailto:”協議格式,那麼該函數將啓動默認郵件客戶程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶機器中安裝了多個郵件客戶程序,則該函數將根據Windows 9x/NT註冊表中mailto協議處理程序的設置確定啓動哪個郵件客戶程序。  
  格式一:mailto:  
  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口。  
  格式二:mailto:用戶賬號@郵件服務器地址  
  如:ShellExecute(handle, ‘open’,‘ mailto:[email protected]’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同)如:ShellExecute(this->m_hWnd,"open",   
             "mailto:[email protected]","","",      SW_SHOW      );這個可以激活Outlook       Express。  
  格式三:mailto:用戶賬號@郵件服務器地址?subject=郵件主題&body=郵件正文  
  如:ShellExecute(handle, ‘open’, ‘ mailto:[email protected]?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字符%0a。  
例子(delphi):  
在一個應用程序調用c:Project1.exe;  
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串內容’,nil, SW_SHOWNORMAL);  
在Project1.exe裏可以調用:  
procedure TForm1.FormCreate(Sender: TObject);  
var i:integer;  
begin  
for i:=1 to paramcount do  
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i));  
end;

最後的那個參數,爲窗口指定可視性方面的一個命令。  
請用下述任何一個常數  
SW_HIDE 隱藏窗口,活動狀態給令一個窗口  
SW_MINIMIZE 最小化窗口,活動狀態給令一個窗口  
SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態  
SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態  
SW_SHOWMAXIMIZED 最大化窗口,並將其激活  
SW_SHOWMINIMIZED 最小化窗口,並將其激活  
SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口  
SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口  
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口  
SW_SHOWNORMAL 與SW_RESTORE相同

 

 

深入淺出ShellExecute     
      譯者:徐景周(原作:Nishant       S)   
    
      Q:       如何打開一個應用程序?       ShellExecute(this->m_hWnd,"open","calc.exe","","",       SW_SHOW       );   
      或       ShellExecute(this->m_hWnd,"open","notepad.exe",   
              "c://MyLog.log","",SW_SHOW       );   
      正如您所看到的,我並沒有傳遞程序的完整路徑。   
      Q:       如何打開一個同系統程序相關連的文檔?       ShellExecute(this->m_hWnd,"open",   
              "c://abc.txt","","",SW_SHOW       );   
      Q:       如何打開一個網頁?       ShellExecute(this->m_hWnd,"open",   
              "http://www.google.com","","",       SW_SHOW       );   
      Q:       如何激活相關程序,發送EMAIL?       ShellExecute(this->m_hWnd,"open",   
              "mailto:[email protected]","","",       SW_SHOW       );   
      Q:       如何用系統打印機打印文檔?       ShellExecute(this->m_hWnd,"print",   
              "c://abc.txt","","",       SW_HIDE);   
      Q:       如何用系統查找功能來查找指定文件?       ShellExecute(m_hWnd,"find","d://nish",   
              NULL,NULL,SW_SHOW);   
      Q:       如何啓動一個程序,直到它運行結束?       SHELLEXECUTEINFO       ShExecInfo       =       {0};   
      ShExecInfo.cbSize       =       sizeof(SHELLEXECUTEINFO);   
      ShExecInfo.fMask       =       SEE_MASK_NOCLOSEPROCESS;   
      ShExecInfo.hwnd       =       NULL;   
      ShExecInfo.lpVerb       =       NULL;   
      ShExecInfo.lpFile       =       "c://MyProgram.exe";   
      ShExecInfo.lpParameters       =       "";   
      ShExecInfo.lpDirectory       =       NULL;   
      ShExecInfo.nShow       =       SW_SHOW;   
      ShExecInfo.hInstApp       =       NULL;   
      ShellExecuteEx(&ShExecInfo);   
      WaitForSingleObject(ShExecInfo.hProcess,INFINITE);   
      或:       PROCESS_INFORMATION       ProcessInfo;     
      STARTUPINFO       StartupInfo;       //This       is       an       [in]       parameter   
      ZeroMemory(&StartupInfo,       sizeof(StartupInfo));   
      StartupInfo.cb       =       sizeof       StartupInfo       ;       //Only       compulsory       field   
      if(CreateProcess("c://winnt//notepad.exe",       NULL,     
              NULL,NULL,FALSE,0,NULL,   
              NULL,&StartupInfo,&ProcessInfo))   
      {     
              WaitForSingleObject(ProcessInfo.hProcess,INFINITE);   
              CloseHandle(ProcessInfo.hThread);   
              CloseHandle(ProcessInfo.hProcess);   
      }       
      else   
      {   
              MessageBox("The       process       could       not       be       started...");   
      }   
    
      Q:       如何顯示文件或文件夾的屬性?       SHELLEXECUTEINFO       ShExecInfo       ={0};   
      ShExecInfo.cbSize       =       sizeof(SHELLEXECUTEINFO);   
      ShExecInfo.fMask       =       SEE_MASK_INVOKEIDLIST       ;   
      ShExecInfo.hwnd       =       NULL;   
      ShExecInfo.lpVerb       =       "properties";   
      ShExecInfo.lpFile       =       "c://";       //can       be       a       file       as       well   
      ShExecInfo.lpParameters       =       "";     
      ShExecInfo.lpDirectory       =       NULL;   
      ShExecInfo.nShow       =       SW_SHOW;   
      ShExecInfo.hInstApp       =       NULL;     
      ShellExecuteEx(&ShExecInfo);   

 

 

 


     附:一些windows的系統命令:

winver---------檢查Windows版本
wmimgmt.msc----打開windows管理體系結構(WMI)
wupdmgr--------windows更新程序
wscript--------windows腳本宿主設置
write----------寫字板
winmsd---------系統信息
wiaacmgr-------掃描儀和照相機嚮導
winchat--------XP自帶局域網聊天

mem.exe--------顯示內存使用情況
Msconfig.exe---系統配置實用程序
mplayer2-------簡易widnows media player
mspaint--------畫圖板
mstsc----------遠程桌面連接
mplayer2-------媒體播放機
magnify--------放大鏡實用程序
mmc------------打開控制檯
mobsync--------同步命令

dxdiag---------檢查DirectX信息
drwtsn32------ 系統醫生
devmgmt.msc--- 設備管理器
dfrg.msc-------磁盤碎片整理程序
diskmgmt.msc---磁盤管理實用程序
dcomcnfg-------打開系統組件服務
ddeshare-------打開DDE共享設置
dvdplay--------DVD播放器

net stop messenger-----停止信使服務
net start messenger----開始信使服務
notepad--------打開記事本
nslookup-------網絡管理的工具嚮導
ntbackup-------系統備份和還原
narrator-------屏幕“講述人”
ntmsmgr.msc----移動存儲管理器
ntmsoprq.msc---移動存儲管理員*作請求
netstat -an----(TC)命令檢查接口

syncapp--------創建一個公文包
sysedit--------系統配置編輯器
sigverif-------文件簽名驗證程序
sndrec32-------錄音機
shrpubw--------創建共享文件夾
secpol.msc-----本地安全策略
syskey---------系統加密,一旦加密就不能解開,保護windows xp系統的雙重密碼
services.msc---本地服務設置
Sndvol32-------音量控制程序
sfc.exe--------系統文件檢查器
sfc /scannow---windows文件保護

tsshutdn-------60秒倒計時關機命令
tourstart------xp簡介(安裝完成後出現的漫遊xp程序)
taskmgr--------任務管理器

eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打開資源管理器

packager-------對象包裝程序
perfmon.msc----計算機性能監測程序
progman--------程序管理器

regedit.exe----註冊表
rsop.msc-------組策略結果集
regedt32-------註冊表編輯器
rononce -p ----15秒關機
regsvr32 /u *.dll----停止dll文件運行
regsvr32 /u zipfldr.dll------取消ZIP支持

cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盤檢查
certmgr.msc----證書管理實用程序
calc-----------啓動計算器
charmap--------啓動字符映射表
cliconfg-------SQL SERVER 客戶端網絡實用程序
Clipbrd--------剪貼板查看器
conf-----------啓動netmeeting
compmgmt.msc---計算機管理
cleanmgr-------好東西整理
ciadv.msc------索引服務程序

osk------------打開屏幕鍵盤
odbcad32-------ODBC數據源管理器
oobe/msoobe /a----檢查XP是否激活
lusrmgr.msc----本機用戶和組
logoff---------註銷命令

iexpress-------木馬捆綁工具,系統自帶

Nslookup-------IP地址偵測器

fsmgmt.msc-----共享文件夾管理器

utilman--------輔助工具管理器

gpedit.msc-----組策略
xp下運行命令大全.

$Systemroot$Documents and Settingsusername 目錄下

appwiz.cpl------------添加刪除程序

control userpasswords2--------用戶帳戶設置

cleanmgr-------垃圾整理

CMD--------------命令提示符可以當作是 Windows 的一個附件,Ping,Convert 這些不能在圖形環境下 使用的功能要藉助它來完成。

cmd------jview察看Java虛擬機版本。

command.com------調用的則是系統內置的 NTVDM,一個 DOS虛擬機。它完全是一個類似 Virtual PC 的 虛擬環境,和系統本身聯繫不大。當我們在命令提示符下運行 DOS 程序時,實際上也 是自動轉移到 NTVDM虛擬機下,和 CMD 本身沒什麼關係。

calc-----------啓動計算器

chkdsk.exe-----Chkdsk磁盤檢查

compmgmt.msc---計算機管理

conf-----------啓動 netmeeting

control userpasswords2-----User Account 權限設置

devmgmt.msc--- 設備管理器

diskmgmt.msc---磁盤管理實用程序

dfrg.msc-------磁盤碎片整理程序

drwtsn32------ 系統醫生

dvdplay--------啓動Media Player

dxdiag-----------DirectX Diagnostic Tool

gpedit.msc-------組策略編輯器

gpupdate /target:computer /force 強制刷新組策略

eventvwr.exe-----事件查看器

explorer-------打開資源管理器

logoff---------註銷命令

lusrmgr.msc----本機用戶和組

msinfo32---------系統信息

msconfig---------系統配置實用程序

net start (servicename)----啓動該服務

net stop (servicename)-----停止該服務

notepad--------打開記事本

nusrmgr.cpl-------同control userpasswords,打開用戶帳戶控制面板

Nslookup-------IP地址偵測器

oobe/msoobe /a----檢查XP是否激活

perfmon.msc----計算機性能監測程序

progman--------程序管理器

regedit----------註冊表編輯器

regedt32-------註冊表編輯器

regsvr32 /u *.dll----停止dll文件運行

route print------查看路由表

rononce -p ----15秒關機

rsop.msc-------組策略結果集

rundll32.exe rundll32.exe %Systemroot%System32shimgvw.dll,ImageView_Fullscreen----啓動一個空白的Windows 圖片和傳真查看器

secpol.msc--------本地安全策略

services.msc---本地服務設置

sfc /scannow-----啓動系統文件檢查器

sndrec32-------錄音機

taskmgr-----任務管理器(適用於2000/xp/2003)

tsshutdn-------60秒倒計時關機命令

winchat--------XP自帶局域網聊天

winmsd---------系統信息

winver-----顯示About Windows 窗口

 

Windows XP的關機是由Shutdown.exe程序來控制的,位於Windows/System32文件夾中。如果想讓Windows 2000也實現同樣的效果,可以把Shutdown.exe複製到系統目錄下。

比如你的電腦要在22:00關機,可以選擇“開始→運行”,輸入“at 22:00 Shutdown -s”, 這樣,到了22點電腦就會出現“系統關機”對話框,默認有30秒鐘的倒計時並提示你保存工作。如果你想以倒計時的方式關機,可以輸入“Shutdown.exe -s -t 3600”,這裏表示60 分鐘後自動關機,“3600”代表60分鐘。

設置好自動關機後,如果想取消的話,可以在運行中輸入“shutdown -a”。另外輸入“shutdown -i”,則可以打開設置自動關機對話框,對自動關機進行設置。

Shutdown.exe的參數,每個都具有特定的用途,執行每一個都會產生不同的效果,比如 “-s”就表示關閉本地計算機,“-a”表示取消關機操作,下面列出了更多參數, 可以在Shutdown.exe中按需使用。

-f:強行關閉應用程序

-m //計算機名:控制遠程計算機

-i:顯示圖形用戶界面,但必須是Shutdown的第一個選項

-l:註銷當前用戶

-r:關機並重啓

-t 時間:設置關機倒計時

-c "消息內容":輸入關機對話框中的消息內容(不能超127個字符)

有時候,我們需要定時關閉計算機,下面介紹一個在Windows XP下實現定時關機的簡單方法。

指定系統在22分鐘後自動關閉:點擊“開始→運行”,在“打開”中輸入命令“Shutdown -s -t 1320”(注意:引號不輸入,參數之間有空格,1320的單位是秒),單擊“確定”
按鈕即可。

指定系統在某個時間(比如12:00)自動關閉:在“打開”中輸入命令
“at 12:00 Shutdown -s”即可。

取消定時關機:在“打開”中輸入命令“Shutdown -a”即可。

d. CreateProcess

下面這個示例的函數可以把給定的DOS命令執行一遍,並把DOS下的輸出內容記錄在buffer中。同時示範了匿名管道重定向輸出的用法:

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

BOOL CDOSDlg::ExecDosCmd()

{

#define EXECDOSCMD "dir c:" //可以換成你的命令

SECURITY_ATTRIBUTES sa;

HANDLE hRead,hWrite;

sa.nLength = sizeof(SECURITY_ATTRIBUTES);

sa.lpSecurityDescriptor = NULL;

sa.bInheritHandle = TRUE;

if (!CreatePipe(&hRead,&hWrite,&sa,0))

{

return FALSE;

}

char command[1024]; //長達1K的命令行,夠用了吧

strcpy(command,"Cmd.exe /C ");

strcat(command,EXECDOSCMD);

STARTUPINFO si;

PROCESS_INFORMATION pi;

si.cb = sizeof(STARTUPINFO);

GetStartupInfo(&si);

si.hStdError = hWrite; //把創建進程的標準錯誤輸出重定向到管道輸入

si.hStdOutput = hWrite; //把創建進程的標準輸出重定向到管道輸入

si.wShowWindow = SW_HIDE;

si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

//關鍵步驟,CreateProcess函數參數意義請查閱MSDN

if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))

{

CloseHandle(hWrite);

CloseHandle(hRead);

return FALSE;

}

CloseHandle(hWrite);

char buffer[4096] = {0}; //用4K的空間來存儲輸出的內容,只要不是顯示文件內容,一般情況下是夠用了。

DWORD bytesRead;

while (true)

{

if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)

break;

//buffer中就是執行的結果,可以保存到文本,也可以直接輸出

AfxMessageBox(buffer); //這裏是彈出對話框顯示

}

CloseHandle(hRead);

return TRUE;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章