批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cmd(.bat是dos下的批處理文件,.cmd是nt內核命令行環境的另一種批處理文件)。
在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe按照該文件中各個命令出現的順序來逐個運行它們。
使用批處理文件(也被稱為批處理程序或腳本),可以簡化日常或重復性任務。
一、參數
1、系統參數
%CD% === 當前路徑 current directory %SystemRoot% === C:\WINDOWS (%windir% 同樣) %ProgramFiles% === C:\Program Files %USERPROFILE% === C:\Documents and Settings\Administrator (子目錄有“桌面”,“開始菜單”,“收藏夾”等) %APPDATA% === C:\Documents and Settings\Administrator\Application Data %TEMP% === C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同樣) %APPDATA% === C:\Documents and Settings\Administrator\Application Data %OS% === Windows_NT (系統) %Path% === %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的設置) %HOMEDRIVE% === C: (系統盤) %HOMEPATH% === \Documents and Settings\Administrator :: 枚舉當前的環境變量 setlocal enabledelayedexpansion FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i !%%i!
2、傳遞參數給批處理文件
%[1-9]表示參數,參數是指在運行批處理文件時在文件名后加的以空格(或者Tab)分隔的字符串。
變量可以從%0到%9,%0表示批處理命令本身,其它參數字符串用 %1 到 %9 順序表示。
Sample1:執行同目錄下的“test2.bat”文件,並輸入兩個參數
call test2.bat "hello" "haha" 在“test2.bat”文件里寫: echo %0 (打印: test2.bat) echo %1 (打印: "hello") echo %2 (打印: "haha") echo %19 (打印: "hello"9)
Sample2:
當我們要建立一個IPC$連接地時候總要輸入一大串命令,弄不好就打錯了,所以我們不如把一些固定命令寫入一個批處理,把肉雞地ip password username 當着參數來賦給這個批處理,這樣就不用每次都打命令了。
@echo off @net use ////1%//ipc$ "2%" /u:"3%" 注意哦,這里PASSWORD是第二個參數。 @if errorlevel 1 echo connection failed
二、簡單批處理內部命令簡介
1、Echo 命令
打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo 命令將顯示當前回顯設置。
語法
echo [{ on|off }] [message]
Sample:@echo off / echo hello world
在實際應用中我們會把這條命令和重定向符號(也稱為管道符號,一般用> >> ^)結合來實現輸入一些命令到特定格式的文件中,這將在以后的例子中體現出來。
2、@ 命令
表示不顯示@后面的命令,在入侵過程中(例如使用批處理來格式化敵人的硬盤)自然不能讓對方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 這個命令是不可以使用/y這個參數的,可喜的是微軟留了個autoset這個參數給我們,效果和/y是一樣的。)
Sample2: @echo off
del test.doc 2>nul
1>nul 意思是不顯示命令運行的正確提示;
2>nul 意思是不顯示錯誤提示;
>nul 意思是屏蔽命令輸出內容。
3、Goto 命令
指定跳轉到標簽,找到標簽后,程序將處理從下一行開始的命令。
語法:goto label (label是參數,指定所要轉向的批處理程序中的行。)
Sample:
if { %1 }=={ } goto noparms
if { %2 }=={ } goto noparms(如果這里的if、%1、%2你不明白的話,先跳過去,后面會有詳細的解釋。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
標簽的名字可以隨便起,但是最好是有意義的字母啦,字母前加個:用來表示這個字母是標簽,goto命令就是根據這個:來尋找下一步跳到到那里。最好有一些說明這樣你別人看起來才會理解你的意圖啊。
4、Rem 命令 (小技巧:用::代替rem)
注釋命令,在C語言中相當與/*--------*/,它並不會被執行,只是起一個注釋的作用,便於別人閱讀和你自己日后修改。
Rem Message
Sample:@Rem Here is the description.
:: 確實可以起到rem 的注釋作用, 而且更簡潔有效; 但有兩點需要注意:
第一, 除了 :: 之外, 任何以 :開頭的字符行, 在批處理中都被視作標號, 而直接忽略其后的所有內容, 只是為了與正常的標號相區別, 建議使用 goto 所無法識別的標號, 即在 :后緊跟一個非字母數字的一個特殊符號。
第 二, 與rem 不同的是, ::后的字符行在執行時不會回顯, 無論是否用echo on打開命令行回顯狀態, 因為命令解釋器不認為他是一個有效的命令行, 就此點來看, rem 在某些場合下將比 :: 更為適用; 另外, rem 可以用於 config.sys 文件中。
5、Pause 命令
運行 Pause 命令時,將顯示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:*.* d://back
echo Please put a new disk into driver A
pause
goto begin
在這個例子中,驅動器 A 中磁盤上的所有文件均復制到d://back中。顯示的注釋提示您將另一張磁盤放入驅動器 A 時,pause 命令會使程序掛起,以便您更換磁盤,然后按任意鍵繼續處理。
6、Call 命令
從一個批處理程序調用另一個批處理程序,並且不終止父批處理程序。call 命令接受用作調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。
語法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
參數
[Drive: }[Path] FileName
指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。
7、start 命令
調用外部程序,所有的DOS命令和命令行程序都可以由start命令來調用。
入侵常用參數:
MIN 開始時窗口最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程序
HIGH 在 HIGH 優先級類別開始應用程序
REALTIME 在 REALTIME 優先級類別開始應用程序
WAIT 啟動應用程序並等候它結束
parameters 這些為傳送到命令/程序的參數
執行的應用程序是 32-位 GUI 應用程序時,CMD.EXE 不等應用程序終止就返回命令提示。如果在命令腳本內執行,該新行為則不會發生。
8、choice 命令
choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。使用時應該加/c:參數,c:后應寫提示可輸入的字符,之間無空格。它的返回碼為1234……
如: choice /c:dme defrag,mem,end
將顯示
defrag,mem,end[D,M,E]?
Sample:
Sample.bat的內容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c://dos//defrag
goto end
:mem
mem
goto end
:end
echo good bye
此文件運行后,將顯示 defrag,mem,end[D,M,E]? 用戶可選擇d m e ,然后if語句將作出判斷,d表示執行標號為defrag的程序段,m表示執行標號為mem的程序段,e表示執行標號為end的程序段,每個程序段最后都以goto end將程序跳到end標號處,然后程序將顯示good bye,文件結束。
9、If 命令
if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。 有三種格式:
(1) if "參數" == "字符串" 待執行的命令
參數如果等於指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)
如if "%1"=="a" format a:
if { %1 }=={ } goto noparms
if { %2 }=={ } goto noparms
(2) if exist 文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
如if exist config.sys edit config.sys
(3) if errorlevel / if not errorlevel 數字 待執行的命令
如果返回碼等於指定的數字,則條件成立,運行命令,否則運行下一句。
如if errorlevel 2 goto x2
DOS程序運行時都會返回一個數字給DOS,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼為0、1。
以下就是幾個常用命令的返回值及其代表的意義:
backup
0 備份成功
1 未找到備份文件
2 文件共享沖突阻止備份完成
3 用戶用ctrl-c中止備份
4 由於致命的錯誤使備份操作中止
diskcomp
0 盤比較相同
1 盤比較不同
2 用戶通過ctrl-c中止比較操作
3 由於致命的錯誤使比較操作中止
4 預置錯誤中止比較
diskcopy
0 盤拷貝操作成功
1 非致命盤讀/寫錯
2 用戶通過ctrl-c結束拷貝操作
3 因致命的處理錯誤使盤拷貝中止
4 預置錯誤阻止拷貝操作
format
0 格式化成功
3 用戶通過ctrl-c中止格式化處理
4 因致命的處理錯誤使格式化中止
5 在提示"proceed with format(y/n)?"下用戶鍵入n結束
xcopy
0 成功拷貝文件
1 未找到拷貝文件
2 用戶通過ctrl-c中止拷貝操作
4 預置錯誤阻止文件拷貝操作
5 拷貝過程中寫盤錯誤
chkdsk
0 未找到錯誤
255 找到一個或多個錯誤
choice
0 用戶按下ctrl+c/break
1 用戶按下第一個鍵
255 檢測到命令行中的錯誤條件
其它 用戶按下的有效字符在列表中的位置
defrag
0 碎片壓縮成功
1 出現內部錯誤
2 磁盤上沒有空簇。要運行DEFRAG,至少要有一個空簇
3 用戶用Ctrl+C退出了DEFRAG
4 出現一般性錯誤
5 DEFRAG在讀簇時遇到錯誤
6 DEFRAG在寫簇時遇到錯誤
7 分配空間有錯
8 內存錯
9 沒有足夠空間來壓縮磁盤碎片
deltree
0 成功地刪除一個目錄
diskcomp
0 兩盤相同
1 發現不同
2 按CTRL+C 終止了比較
3 出現嚴重錯誤
4 出現初始化錯誤
find
0 查找成功且至少找到了一個匹配的字符串
1 查找成功但沒找到匹配的字符串
2 查找中出現了錯誤
keyb
0 鍵盤定義文件裝入成功
1 使用了非法的鍵盤代碼,字符集或語法
2 鍵盤定義文件壞或未找到
4 鍵盤、監視器通訊時出錯
5 要求的字符集未准備好
move
0 成功地移動了指定的文件
1 發生了錯誤
msav /N
86 檢查到了病毒
replace
0 REPLACE成功地替換或加入了文件
1 MS-DOS版本和REPLACE不兼容
2 REPLACE找不到源文件
3 REPLACE找不到源路徑或目標路徑
5 不能存取要替換的文件
8 內存不夠無法執行REPLACE
11 命令行句法錯誤
restore
0 RESTORE成功地恢復了文件
1 RESTORE找不到要恢復的文件
3 用戶按CTRL+C終止恢復過程
4 RESTORE因錯誤而終止
scandisk
0 ScanDisk在它檢查的驅動器上未檢測到任何錯誤
1 由於命令行的語法不對,不能運行ScanDisk
2 由於內存用盡或發生內部錯誤,ScanDisk意外終止
3 用戶讓ScanDisk中途退出
4 進行盤面掃描時,用戶決定提前退出
254 ScanDisk找到磁盤故障並已全部校正
255 ScanDisk找到磁盤故障,但未能全部校正
setver
0 SETVER成功地完成了任務
1 用戶指定了一個無效的命令開關
2 用戶指定了一個非法的文件名
3 沒有足夠的系統內存來運行命令
4 用戶指定了一個非法的版本號格式
5 SETVER在版本表中未找到指定的項
6 SETVER未找到SETVER.EXE文件
7 用戶指定了一個非法的驅動器
8 用戶指定了太多的命令行參數
9 SETVER檢測到丟失了命令行參數
10 在讀SETVER.EXE文件時,SETVER檢測到發生錯誤
11 SETVER.EXE文件損壞
12 指定的SETVER.EXE文件不支持版本表
13 版本表中沒有足夠的空間存放新的項
14 在寫SETVER.EXE文件時SETVER檢測到發生錯誤
10、for 命令
for 命令是一個比較復雜的命令,主要用於參數在指定的范圍內循環執行命令。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable
for { %variable|%%variable } in (set) do command [ CommandLineOptions]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters 為特定命令指定參數或命令行開關。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable而不要用 %variable。
變量名稱是區分大小寫的,所以 %i 不同於 %I。
Sample:
建立C:\TEST1.BAT,文件內容如下:
@ECHO OFF
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C
運行:
C:\>TEST1
執行以后,屏幕上會將C:盤根目錄下所有以BAT、TXT、SYS為擴展名的文件內容顯示出來(不包括隱藏文件)。
11、比較運算符
EQU - 等於 (一般使用“==”)
NEQ - 不等於 (沒有 “!=”,改用“ if not 1==1 ”的寫法)
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
三、如何使用組合命令(Compound Command)
1、&
Usage:第一條命令 & 第二條命令 [& 第三條命令...]
用這種方法可以同時執行多條命令,而不管命令是否執行成功
Sample:
C://>dir z: & dir c://Ex4rch
The system cannot find the path specified.
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c://Ex4rch
2002-05-14 23:51 <DIR> .
2002-05-14 23:51 <DIR> ..
2002-05-14 23:51 14 sometips.gif
2、&&
Usage:第一條命令 && 第二條命令 [&& 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行出錯的命令后將不執行后面的命令,如果一直沒有出錯則一直執行完所有命令;
Sample:
C://>dir z: && dir c://Ex4rch
The system cannot find the path specified.
C://>dir c://Ex4rch && dir z:
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c://Ex4rch
2002-05-14 23:55 <DIR> .
2002-05-14 23:55 <DIR> ..
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
2 Dir(s) 768,671,744 bytes free
The system cannot find the path specified.
在做備份的時候可能會用到這種命令會比較簡單,如:
dir file://192.168.0.1/database/backup.mdb && copy file://192.168.0.1/database/backup.mdb E://backup
如果遠程服務器上存在backup.mdb文件,就執行copy命令,若不存在該文件則不執行copy命令,這種用法可以替換IF exist了。
3、||
Usage:第一條命令 || 第二條命令 [|| 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行正確的命令后將不執行后面的命令,如果沒有出現正確的命令則一直執行完所有命令;
Sample:
C://Ex4rch>dir sometips.gif || del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of C://Ex4rch
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free
組合命令使用的例子:
sample:
@copy trojan.exe ////%1//admin$//system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt
四、管道命令的使用
1、| 命令
Usage:第一條命令 | 第二條命令 [| 第三條命令...]
將第一條命令的結果作為第二條命令的參數來使用,記得在unix中這種方式很常見。
sample:
time /t>>D://IP.log
netstat -n -p tcp|find ":3389">>D://IP.log
start Explorer
看出來了么?用於終端服務允許我們為用戶自定義起始的程序,來實現讓用戶運行下面這個bat,以獲得登錄用戶的IP。
2、>、>>輸出重定向命令
將一條命令或某個程序輸出結果的重定向到特定文件中, > 與 >>的區別在於,>會清除調原有文件中的內容后寫入指定文件,而>>只會追加內容到指定文件中,而不會改動其中的內容。
sample1:
echo hello world>c://hello.txt (stupid example?)
sample2:
時下DLL木馬盛行,我們知道system32是個捉迷藏的好地方,許多木馬都削尖了腦袋往那里鑽,DLL馬也不例外,針對這一點我們可以在安裝好系統和必要的應用程序后,對該目錄下的EXE和DLL文件作一個記錄:
運行CMD--轉換目錄到system32--dir *.exe>exeback.txt & dir *.dll>dllback.txt,
這樣所有的EXE和DLL文件的名稱都被分別記錄到exeback.txt和dllback.txt中,
日后如發現異常但用傳統的方法查不出問題時,則要考慮是不是系統中已經潛入DLL木馬了.
這時我們用同樣的命令將system32下的EXE和DLL文件記錄到另外的exeback1.txt和dllback1.txt中,然后運行:
CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt.(用FC命令比較前后兩次的DLL和EXE文件,並將結果輸入到diff.txt中),這樣我們就能發現一些多出來的DLL和EXE文件,然后通過查看創建時間、版本、是否經過壓縮等就能夠比較容易地判斷出是不是已經被DLL木馬光顧了。沒有是最好,如果有的話也不要直接DEL掉,先用regsvr32 /u trojan.dll將后門DLL文件注銷掉,再把它移到回收站里,若系統沒有異常反映再將之徹底刪除或者提交給殺毒軟件公司。
3、< 、>& 、<&
< 從文件中而不是從鍵盤中讀入命令輸入。
>& 將一個句柄的輸出寫入到另一個句柄的輸入中。
<& 從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。
這些並不常用,也就不多做介紹。
五、注冊表操作
1、備份注冊表,將[HKEY_LOCAL_MACHINE ... Run]的內容,備份到“c:\windows\1.reg”
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run c:\windows\1.reg
reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\windows\2.reg
2、修改/添加注冊表內容
a.一般的添加或修改
reg add "HKCU\Environment" /v Java_Home /t reg_sz /d "D:\Java\jdk1.6.0_07" /f
上句解析:“HKCU”是“HKEY_CURRENT_USER”的縮寫,不用縮寫用全稱也可以;
添加名稱為“Java_Home”的變量;類型為“reg_sz”,另一種常見類型是“reg_dword”;值為 D:\Java\jdk1.6.0_07;
b.使用變量
set SoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java reg add "%SoftWareHome%Web Start\1.6.0_07" /v Home /t reg_sz /d "%cd%\jre1.6.0_07\bin" /f
c.如果注冊表的名稱有空格,或者數據用特殊符號時
reg add "%SoftWareHome2%\HelpCommands" /v "01:Online Documentation" /t reg_sz /d "\"%cd%\Documentation\Index.htm\"" /f 傳入值為(值用雙引號括起來的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm" reg add "%SoftWareHome2%\Paths" /v ReportTemplates /t reg_sz /d "%cd%\Resource Files\Report Templates\\" /f 傳入值為(“\”結尾的): E:\Holemar\1.notes\90. Windows\Resource Files\Report Templates\
d.增加空的內容
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"
e.添加或修改默認值
reg add "%vpath%InstallPath" /ve /t reg_sz /d "%cd%" /f
這里用“/ve”來代替一般修改時的“/v 變量名”,即可修改默認值了
3、刪除注冊表的內容
雙引號里面的是注冊表的目錄,下面兩句將刪除這目錄下的所有信息
reg delete "HKEY_CURRENT_USER\Software\RealVNC" /f
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC" /f
雙引號里面的是注冊表的目錄,下面一句將刪除這目錄下指定的某個信息
reg delete "HKEY_LOCAL_MACHINE\Software\RealVNC" /v VNC_Server /f
4、注冊表的常用位置
a.系統啟動項:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
example:
REG ADD HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v VNC_Server /t REG_SZ /d "%cd%\VNC_Server.bat" /f
b.系統環境變量:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
c.當前用戶的環境變量:
[HKEY_CURRENT_USER\Environment]
5、修改注冊表之后,結束並重新加載explorer.exe進程,可刷新注冊表,令其生效
taskkill /f /im explorer.exe >nul start "" "explorer.exe"
六、系統服務
1、啟停服務
停止服務:NET STOP 服務名
啟動服務:NET Start 服務名
2、設置啟動類型
自動: SC CONFIG 服務名 START= auto
手動: SC CONFIG 服務名 START= demand
已禁用:SC CONFIG 服務名 START= disabled
附:“START= ”等號后面必須要有一個空格。(start還有boot,system兩個值)
Sample:
SC CONFIG Spooler START= demand (打印機加載項,設置成手動,默認自動)
3、查看系統服務
start %SystemRoot%\system32\services.msc /s
七、其他命令
1、ping 命令
測試網絡聯接狀況以及信息包發送和接收狀況,但是不能夠測試端口。
語法:ping IP地址或主機名 [-t] [-a] [-n count] [-l size]
參數含義:
-t 不停地向目標主機發送數據;
-a 以IP地址格式來顯示目標主機的網絡地址;
-n count 指定要Ping多少次,具體次數由count來指定;
-l size 指定發送到目標主機的數據包的大小。
Sample: ping 192.168.0.1 -t (不停的測試192.168.0.1,按ctrl+c停止) Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >> tmp.txt (ping一下所有的局域網電腦)
2、telnet 命令
測試端口使用 telnet IP地址或主機名端口,使用tcp協議
Sample: telnet 192.168.0.1 80 (測試192.168.0.1的80端口)
3、color 命令
設置背景及字體顏色
語法: color bf
b 是指定背景色的十六進制數字; f 指定前景顏色(即字體顏色)。
顏色值: 0:黑色 1:藍色 2:綠色 3:湖藍 4:紅色 5:紫色 6:黃色 7:白色
8:灰色 9:淡藍 A:淡綠 B:淺綠 C:淡紅 D:淡紫 E:淡黃 F:亮白
如果沒有給定任何參數,該命令會將顏色還原到 CMD.EXE 啟動時的顏色。
如果兩參數一樣,視為無效輸入。只有一個參數時,設置字體。
4、random 命令
產生隨機數(正整數0~)
5、exit 命令
結束程序。即時是被調用的程序,結束后也不會返回原程序
6、shutdown命令
shutdown -s 關機
7、 所有內置命令的幫助信息
ver /? cmd /? set /? rem /? if /? echo /? goto /? for /? shift /? call /?
其他需要的常用命令
type /? find /? findstr /? copy /?
---------------------------------------------------------------------------------------------------------------------------------------------
自己工作中,經常要同步幾個目錄下的文件或目錄,所以自己看了下批處理語法,寫了個下面的bat:
:: 覆蓋目錄或單個文件 @rem 關閉顯示"輸出命令" @echo off :: 定義全局變量 :: 源文件/目錄相對路徑(如果是文件夾,末尾要加\) set FILE_NAME=application\modules\all\views\interfaceJS_tiny.phtml :: 源文件/目錄絕對路徑 set SOU_PATH=E:\ProjectFile\work\ousucms\trunk\%FILE_NAME% :: 目標文件/目錄絕對路徑 set DES_PATH=E:\ProjectFile\work set DES_CMS=%DES_PATH%\ousucms\trunk\%FILE_NAME% set DES_OA=%DES_PATH%\ousuoa\trunk\%FILE_NAME%::goto :end :: CMS if "%DES_CMS%"=="" goto :skip if "%DES_CMS%" NEQ "%SOU_PATH%" ( if exist %DES_CMS% ( (pushd %DES_CMS% 2>nul) || (goto :isfile) echo 開始刪除目錄 "DES_CMS": rmdir %DES_CMS% /s /q if "%errorlevel%" == "0" (echo 刪除成功) else (echo 刪除失敗) echo 開始復制目錄 "%SOU_PATH%" 到 "%DES_CMS%": xcopy %SOU_PATH%* %DES_CMS% /e /h /d /y popd goto :skip ) ) :isfile copy %SOU_PATH% %DES_CMS% /y :skip :: OA if "%DES_OA%"=="" goto :skip if "%DES_OA%" NEQ "%SOU_PATH%" ( if exist %DES_OA% ( (pushd %DES_OA% 2>nul) || (goto :isfile) echo 開始刪除目錄 "DES_OA": rmdir %DES_OA% /s /q if "%errorlevel%" == "0" (echo 刪除成功) else (echo 刪除失敗) echo 開始復制目錄 "%SOU_PATH%" 到 "%DES_OA%": xcopy %SOU_PATH%* %DES_OA% /e /h /d /y popd goto :skip ) ) :isfile copy %SOU_PATH% %DES_OA% /y :skip :end pause
參考:http://www.cnitblog.com/martin/archive/2006/04/21/9461.html
http://hi.baidu.com/i7ever/item/6dc4e64b7f3ddf0d6cc2f0cf
http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html