Dos命令初階--文件拷貝
1、XCOPY命令
可以在cmd中錄入:XCOPY /? 即可查看幫助
幫助:
XCOPY Microsoft Windows [版本 6.2.9200] (c) 2012 Microsoft Corporation。保留所有權利。 C:\Users\Administrator>xcopy /? 復制文件和目錄樹。 XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/J] [/EXCLUDE:file1[+file2][+file3]...] source 指定要復制的文件。 destination 指定新文件的位置和/或名稱。 /A 僅復制有存檔屬性集的文件, 但不更改屬性。 /M 僅復制有存檔屬性集的文件, 並關閉存檔屬性。 /D:m-d-y 復制在指定日期或指定日期以后更改的文件。 如果沒有提供日期,只復制那些 源時間比目標時間新的文件。 /EXCLUDE:file1[+file2][+file3]... 指定含有字符串的文件列表。每個字符串 在文件中應位於單獨的一行。如果任何 字符串與復制文件的絕對路徑的任何部分相符, 則排除復制該文件。例如, 指定如 \obj\ 或 .obj 的字符串會分別 排除目錄 obj 下面的所有文件或帶有 .obj 擴展名的所有文件。 /P 創建每個目標文件之前提示你。 /S 復制目錄和子目錄,不包括空目錄。 /E 復制目錄和子目錄,包括空目錄。 與 /S /E 相同。可以用來修改 /T。 /V 驗證每個新文件的大小。 /W 提示你在復制前按鍵。 /C 即使有錯誤,也繼續復制。 /I 如果目標不存在,且要復制多個文件, 則假定目標必須是目錄。 /Q 復制時不顯示文件名。 /F 復制時顯示完整的源文件名和目標文件名。 /L 顯示要復制的文件。 /G 允許將加密文件復制到 不支持加密的目標。 /H 也復制隱藏文件和系統文件。 /R 覆蓋只讀文件。 /T 創建目錄結構,但不復制文件。不 包括空目錄或子目錄。/T /E 包括 空目錄和子目錄。 /U 只復制已經存在於目標中的文件。 /K 復制屬性。一般的 Xcopy 會重置只讀屬性。 /N 用生成的短名稱復制。 /O 復制文件所有權和 ACL 信息。 /X 復制文件審核設置(隱含 /O)。 /Y 取消提示以確認要覆蓋 現有目標文件。 /-Y 要提示以確認要覆蓋 現有目標文件。 /Z 在可重新啟動模式下復制網絡文件。 /B 復制符號鏈接本身與鏈接目標。 /J 復制時不使用緩沖的 I/O。推薦復制大文件時使用。 開關 /Y 可以預先在 COPYCMD 環境變量中設置。 這可能被命令行上的 /-Y 覆蓋。 C:\Users\Administrator>
認真讀懂這些參數,即可寫Copy命令了。
簡單的:
xcopy source target
下面介紹幾種常見用法:
1)拷貝文件
將C盤的info.txt文件拷貝到D盤根目錄。
xcopy C:\info.txt D:\
將命令保存到bat文件,然后在C盤創建info.txt,執行bat文件,即可在D盤看到。
2)指定參數,強制覆蓋
如果重復執行,因為文件已經存在,則會給出提示
我們加入強制執行參數:
xcopy C:\info.txt D:\ /Y
我們從上文的幫助中砍下其命令說明:
/Y 取消提示以確認要覆蓋 現有目標文件。 /-Y 要提示以確認要覆蓋 現有目標文件。
然后,就可以重復執行,每次都會覆蓋。
3)拷貝文件,只拷貝更新文件
每次都強制copy,如果源文件比目標目錄的文件,日期新,才copy怎么辦呢?
增加配置參數:D
xcopy C:\info.txt D:\ /Y/D
對應才參數說明:
/D:m-d-y 復制在指定日期或指定日期以后更改的文件。
如果沒有提供日期,只復制那些
源時間比目標時間新的文件。
4)拷貝目錄
其實與拷貝文件類似。
xcopy C:\test D:\test /D/Y
如果D:\test文件夾不存在,則會自動創建。
在C盤的test文件中創建文件和文件夾,即可進行Copy。
第一次執行會出現提示:是文件還是目錄。
如何指定其為目錄,無需客戶判定呢?
解決辦法:默認是目錄:/I
xcopy C:\test D:\test2 /I/D/Y
其使用說明:
/I 如果目標不存在,且要復制多個文件,
則假定目標必須是目錄。
5)拷貝目錄中包含子目錄
根據上面的腳本,只能復制當前目錄下的文件及目錄
我們可以使用/S 或者/E
xcopy C:\test D:\test2 /E/I/D/Y
這樣,其C:\test下的所有文件,包括子目錄與空目錄,以及子目錄的子目錄文件,也都成功拷貝到了目標目錄。
/S與/E具體解釋:
/S 復制目錄和子目錄,不包括空目錄。 /E 復制目錄和子目錄,包括空目錄。 與 /S /E 相同。可以用來修改 /T。
6)如果Copy只讀文件
當文件Copy到目標目錄,如果其是或者設置為只讀文件,則無法覆蓋。
這時我們用到了參數/R
xcopy C:\test D:\test /E/R/I/D/Y
具體解釋:
/R 覆蓋只讀文件。
其他的命令參數,我們這里不再介紹,根據自己的需要,認真研究幫助文檔。
2、echo命令,增加描述
通過XCOPY命令,可以很輕松的實現copy功能。為了讓界面更友好,我們希望將執行的情況展現給用戶。
這時候就需要echo命令。
在cmd中輸入:echo /?查看幫助
C:\Users\Administrator>echo /? 顯示信息,或啟用或關閉命令回顯。 ECHO [ON | OFF] ECHO [message] 要顯示當前回顯設置,鍵入不帶參數的 ECHO。
幾種常見功能介紹:
1)輸出提示信息
格式:ECHO信息內容
echo HelloWorld
執行結果:
2)作為控制批處理命令在執行時是否顯示命令行自身的開關
格式:ECHO [ON|OFF]
如果想關閉“ECHO OFF”命令行自身的顯示,則需要在該命令行前加上“@”。
在上圖中,我們可以看到前面總是有路徑信息,很煩,能否只展現dos命令執行信息呢?這就要用到ECHO OFF
@echo OFF
echo HelloWorld
pause
執行結果:
看到了,cmd窗口只剩下dos命令了。簡潔漂亮。
3)echo還有其他功能,如改變背景色、輸出文件等。這里不再介紹。
3、SET命令,設置變量
用戶錄入還需要給出具體的提示。
但是,我們希望將文件拷貝到用戶指定的目錄中去。
需要提供一個交互頁面,指導用戶進行操作。
這就需要dos的set命令。用來設置變量。
SET [variable=[string]]
variable 指定環境變量名。
string 指定要指派給變量的一系列字符串。 要顯示當前環境變量,鍵入不帶參數的 SET。 SET 命令不允許變量名含有等號。
但獲取變量時,用%variable%獲取
在cmd中可以輸入:SET /? 查看詳細幫助。
1)設置變量
例子:
@echo OFF set name=Tom echo %name%
2)給出輸入提示,則需要/p參數
SET /P variable=[promptString]
看一個helloworld的例子
echo set /p name=請輸入您的名字 echo Hello %name%,welcome to dos world. pause
3)用set命令進行簡單計算
語法:
SET /A expression
/A 命令行開關指定等號右邊的字符串為被評估的數字表達式。該表達式評估器很簡單並以遞減的優先權順序支持下列操作。
例子:1+1=2
@echo OFF set /p expresion=請輸入數學表達式 set /a result = %expresion% echo %result% pause
關於set可以進行計算的功能,還有很多詳細的內容,這里不再多說,可以查詢相關的資料。
4)set用於字符串處理
1)字符串替換
語法:
%var:str1=str2%
含義:將字符串變量%var%中的str1替換為str2
例子:
@echo OFF set var=堅持就是勝利 echo 替換前的值為:"%var%" set var=%var:是=能% echo 替換后的值為:%var% pause
執行結果:
2)字符串截取
語法:
%var:~[m[,n]]%
方括號表示可選,%為變量標識符,var為變量名,不可少,冒號用於分隔變量名和說明部分,符號~可以簡單理解為“偏移”即可,m為偏移量(缺省為0),n為截取長度(缺省為全部) %PATH:~10,5%
例子:
@echo OFF set var=堅持就是勝利 echo 截取前:%var%% set var="%var:~0,2%" echo 截取后:%var% pause
結果:
截取長度可以為負數:
語法:
%var:~0,-2%
含義:把字符串倒數第三位開始的所有值付給變量。
負數,代表逆向。
@echo OFF set var=堅持就是勝利 echo 截取前:%var%% set var="%var:~0,-2%" echo 截取后:%var% pause
結果:
其實位置可以省略
語法:
%var:~-2%
含義:從變量var字符串,從末尾開始,截取2個字符。
@echo OFF set var=堅持就是勝利 echo 截取前:%var%% set var="%var:~-2%" echo 截取后:%var% pause
結果:
4、IF命令,判斷
設置了路徑,我們需要判斷是否存在,通過IF語句
在cmd中輸入:IF /? 查看if語句的使用幫助。

執行批處理程序中的條件處理。 IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command NOT 指定只有條件為 false 的情況下,Windows 才 應該執行該命令。 ERRORLEVEL number 如果最后運行的程序返回一個等於或大於 指定數字的退出代碼,指定條件為 true。 string1==string2 如果指定的文字字符串匹配,指定條件為 true。 EXIST filename 如果指定的文件名存在,指定條件為 true。 command 如果符合條件,指定要執行的命令。如果指定的 條件為 FALSE,命令后可跟 ELSE 命令,該命令將 在 ELSE 關鍵字之后執行該命令。 ELSE 子句必須出現在同一行上的 IF 之后。例如: IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. ) 由於 del 命令需要用新的一行終止,因此以下子句不會有效: IF EXIST filename. del filename. ELSE echo filename. missing 由於 ELSE 命令必須與 IF 命令的尾端在同一行上,以下子句也 不會有效: IF EXIST filename. del filename. ELSE echo filename. missing 如果都放在同一行上,以下子句有效: IF EXIST filename. (del filename.) ELSE echo filename. missing 如果命令擴展被啟用,IF 會如下改變: IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command 其中, compare-op 可以是: EQU - 等於 NEQ - 不等於 LSS - 小於 LEQ - 小於或等於 GTR - 大於 GEQ - 大於或等於 而 /I 開關(如果指定)說明要進行的字符串比較不分大小寫。 /I 開關可以用於 IF 的 string1==string2 的形式上。這些 比較都是通用的;原因是,如果 string1 和 string2 都是 由數字組成的,字符串會被轉換成數字,進行數字比較。 CMDEXTVERSION 條件的作用跟 ERRORLEVEL 的一樣,除了它 是在跟與命令擴展有關聯的內部版本號比較。第一個版本 是 1。每次對命令擴展有相當大的增強時,版本號會增加一個。 命令擴展被停用時,CMDEXTVERSION 條件不是真的。 如果已定義環境變量,DEFINED 條件的作用跟 EXIST 的一樣, 除了它取得一個環境變量,返回的結果是 true。 如果沒有名為 ERRORLEVEL 的環境變量,%ERRORLEVEL% 會擴充為 ERROLEVEL 當前數值的字符串表達式;否則,你會得到 其數值。運行程序后,以下語句說明 ERRORLEVEL 的用法: goto answer%ERRORLEVEL% :answer0 echo Program had return code 0 :answer1 echo Program had return code 1 你也可以使用以上的數字比較: IF %ERRORLEVEL% LEQ 1 goto okay 如果沒有名為 CMDCMDLINE 的環境變量,%CMDCMDLINE% 將在 CMD.EXE 進行任何處理前擴充為傳遞給 CMD.EXE 的原始 命令行;否則,你會得到其數值。 如果沒有名為 CMDEXTVERSION 的環境變量, %CMDEXTVERSION% 會擴充為 CMDEXTVERSION 當前數值的 字串符表達式;否則,你會得到其數值。
這里舉兩個簡單例子
1)判斷字符串
@echo OFF SET /P var=是否繼續執行,請輸入Y或N ECHO 輸入的值為:"%var%" IF "%var%"=="Y" ( echo 繼續執行... )ELSE ( echo 退出中... ) pause
2)判斷文件是否存在
@echo OFF set /P var=請輸入文件名,包括文件路徑,如:C:\Info.txt echo 輸入的值為:"%var%" if exist %var%. (echo 文件存在. ) else echo 文件不存在. pause
備注:if與else在同一行中
如果是分行處理,一定要保證括號附近有空格,否則會報語法錯誤,如下:
@echo OFF set /P var=請輸入文件名,包括文件路徑,如:C:\Info.txt echo 輸入的值為:"%var%" if exist %var% ( echo 文件存在 ) else ( echo 文件不存在 ) pause
執行結果:
5、goto語句,用於語句跳轉
如果對不同的情況,需要執行不同的既定操作,若還是按照常規的執行流程的話,是無法完成任務的,這個時候,就需要引入流程跳轉的概念,動用流程跳轉語句 goto 了。流程跳轉的含義是:改變默認的執行順序,強制跳轉到指定的位置執行特定的程序塊。
先來看個例子:假設需要判斷用戶輸入的是A還是B,代碼可以寫成這樣:
@echo off set /p input=請輸入字母A或B: if "%input%"=="A" goto A if "%input%"=="B" goto B pause exit :A echo 您輸入的字母是A pause exit :B echo 您輸入的字母是B pause exit
6、pause命令,暫停批處理程序
暫停批處理程序,並顯示以下消息:
請按任意鍵繼續. . .
7、rem命令,注釋
為了bat腳本更好看,需添加注釋,就需要rem命令
語法:
REM [COMMENT]
在文件開頭寫說明性文字如:
REM 拷貝文件 REM CREATEBY YANK REM 2014-08-25
如果注釋多行,可以采取goto語句
goto Main 拷貝文件 CREATEBY YANK 2014-08-25 :Main
最后的拷貝腳本如下:
goto MAIN 拷貝文件 CREATEBY YANK 2014-08-25 :MAIN @echo off echo "Copy start" echo 請輸入需要拷貝的目標路徑 echo 請輸入target的路徑,如:D:\target :SETTARGET set /p target=請輸入target的路徑: if "%target%"=="" ( echo 未輸入target的路徑 echo 補丁文件安裝失敗 echo 退出... pause goto QUIT ) if not exist "%target%" ( echo 輸入的target地址不存在,請檢查后重新輸入 goto SETTARGET ) else ( xcopy C:\test %target% /E/R/I/D/Y ) :QUIT
其他
1、bat執行,漢字出現亂碼
找了很多,最終,將bat文件用記事本打開,另存為ANSI格式即可。之前是UTF-8。