寫批處理文件,除了瞭解基本語法外,你還須要熟悉經常使用的windows命令,那就先看看這篇文章:
windows經常使用命令javascript
#重要說明html
文件及目錄路徑:要使用反斜槓'**\**',不要使用正斜槓'/' 如:del d:\test2\file\my.txt 文件及目錄路徑:若存在空格,應使用雙引號將路徑引發來 如:del "d:\program files\file\my.txt" 文件及目錄名中不能包含下列任何字符:\ / : * ? " < > |
0. 參數java
bat批處理文件理論上支持無限多個參數的傳入,但最多支持**9**個參數的獲取 例:make_release.bat 258 mslugx 3 4 5 6 7 8 9 10 11 12 13 14 15 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* // 命令行傳遞給批處理文件的參數 %0 // 批處理文件名(非全路徑) make_release.bat %1 // 第1個參數 258 %9 // 第9個參數 9 %* // 從第1個參數開始的全部參數 258 mslugx 3 4 5 6 7 8 9 10 11 12 13 14 15 爲了獲取更多的參數,可使用**shift**命令達到目的 shift /3 // 去掉第3個參數 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 輸出:258 mslugx 4 5 6 7 8 9 10 11 shift /4 // 在上面剩餘參數的基礎上,再去掉第4個參數 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 輸出:258 mslugx 4 6 7 8 9 10 11 12 shift /5 // 在上面剩餘參數的基礎上,再去掉第5個參數 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 輸出:258 mslugx 4 6 8 9 10 11 12 13 shift // 在上面剩餘參數的基礎上,再去掉第1個參數;shift、shift /0和shift /1的做用一致 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 // 輸出:mslugx 4 6 8 9 10 11 12 13 14
參數擴展加強(以%1爲例說明):【注:如下加強用法也適用於for變量】 %~1 - 刪除引號" (1)若字符串首尾同時存在引號,則刪除首尾的引號;(2)若字符串尾不存在引號,則刪除字符串首的引號;(3)若是字符串中間存在引號,或者只在尾部存在引號,則不刪除。 %~f1 - 將文件名擴展到一個徹底合格的路徑名 %~d1 - 將文件名擴展到一個驅動器號 %~p1 - 將文件名擴展到一個路徑 %~n1 - 將文件名擴展到一個文件名 %~x1 - 將文件名擴展到一個文件擴展名 %~s1 - 擴展的路徑指含有短名 %~a1 - 將 %1 擴展到文件屬性 %~t1 - 將 %1 擴展到文件的日期/時間 %~z1 - 將 %1 擴展到文件的大小 %~$PATH:1 - 查找列在 PATH 環境變量的目錄,並將 %1擴展到找到的第一個徹底合格的名稱 若是環境變量名未被定義,或者沒有找到文件,此組合鍵會擴展到空字符串 組合修定符: %~dp1 - 將 %1 擴展到驅動器號和路徑 %~nx1 - 將 %1 擴展到文件名和擴展名 %~dp$PATH:1 - 在列在 PATH 環境變量中的目錄裏查找 %1,並擴展到找到的第一個文件的驅動器號和路徑 %~ftza1 - 若 %1 爲目錄或文件,會轉變成dir的輸出行 注:**%~dp0** 返回當前bat文件所在目錄的全路徑 注:**%~n0** 返回當前bat文件名(不含擴展名) 注:**%~nx0** 返回當前bat文件名(含擴展名)
使用for和goto打印各個參數數據庫
@echo off call process.bat %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% "%random%" pause
set "f=%*" if not defined f (echo 沒有參數! & goto :eof) echo 過程名稱: %0 echo 完整參數: %* echo -------------------------------------- echo 用for循環: set /a x=1 for %%i in (%*) do (call echo 第%%x%%個參數 %%~i & set /a x+=1) echo -------------------------------------- echo 用goto循環: set /a y=1 :loop set "t=%~1" if not defined t goto :eof echo 第%y%個參數: %~1 set /a y+=1 shift goto loop
無限循環執行net user命令(按ctrl+c能夠結束命令執行)windows
work.bat緩存
@echo off net user %0
1. 經常使用特殊符號網絡
& 順序執行多條命令,而無論命令是否執行成功app
例:cd /d d:\src&work.exe /o c:\result.txt // 先將當前工做目錄切換到d:\src下,而後執行work.exe /o c:\result.txt命令 **&&** 順序執行多條命令,當碰到執行出錯的命令後將不執行後面的命令 例:find "ok" c:\test.txt && echo 成功 // 若是找到了"ok"字樣,就顯示"成功",找不到就不顯示 **||** 順序執行多條命令,當碰到執行正確的命令後將不執行後面的命令 例:find "ok" c:\test.txt || echo 不成功 // 若是找不到"ok"字樣,就顯示"不成功",找到了就不顯示 **|** 管道命令 例:dir *.* /s/a | find /c ".exe" // 先執行dir命令,而後對輸出的結果執行find命令(輸出當前文件夾及全部子文件夾裏的.exe文件的個數) **>** 將當前命令輸出以覆蓋的方式重定向 例:tasklist > p1.txt // 將tasklist的輸出以覆蓋的方式重定向到p1.txt文件中 **>>** 將當前命令輸出以追加的方式重定向 例:tasklist >> p2.txt // 將tasklist的輸出以追加的方式重定向到p2.txt文件中 **<** 從文件中得到輸入信息,而不是從屏幕上,通常用於date time label等須要等待輸入的命令 例:date <temp.txt // temp.txt中的內容爲2005-05-01 **@** 命令修飾符 在執行命令前,不打印出該命令的內容 例:@cd /d d:\me // 執行該命令時,不打印出命令的內容:cd /d d:/me **^** 轉義字符及echo續行符號 (1) 用在特殊字符前面,用於取消該特殊字符的做用。支持的特殊字符有&、|、>、<、(、)、!、"等,不包括% (2) echo輸出時,能夠將^後的下一行的字符串拼接在當前行後輸出 **$** 在prompt命令中,稱爲選項轉義字符,能夠將其後的字符轉義爲特定的做用效果。 **>&** 將一個句柄的輸出寫入到另外一個句柄的輸入中。 **<&** 與>&相反,從一個句柄讀取輸入並將其寫入到另外一個句柄輸出中 **%** 非延遲環境變量引用符號 **!** 延遲環境變量引用符號 **:** 批處理標籤引導符 **nul** 用於屏蔽命令的輸出結果,常見用於pause > nul;有時咱們輸錯命令,cmd上會提示:xx‘不是內部或外部命令...爲了徹底屏蔽掉這些,可使用xx >nul 2>nul *** ?** 文件通配符,*表明n個字符,?表明1個字符
2. 變量dom
dos計算說明:ide
(1)只能進行整數運算,精確到整數,不能進行浮點運算
(2)只能精確到32位,有效值範圍是-2147483648至2147483647
(3)十六進制前綴爲:0x 八進制前綴爲:0
自定義變量
在定義變量時要尤爲注意空格,以下:
set var1 =test // 在等號前加了一個空格,那麼定義的變量名爲"var1 ",而不是"var1"
set var2= test // 在等號後加了一個空格,那麼定義的變量var2爲" test",而不是"test"
\------------------------------------------- set var=你好 echo %var% // 輸出:你好 set var // 查看全部以var開頭變量的值 set var=//清空var變量,var變成not defined狀態 \-------------------------------------- set /p var=請輸入變量的值: // 等待用戶輸入到var變量中 \-------------------------------------- set /p= hello world! <nul // 輸出hello world! 到屏幕上,字符串開頭的空格將會被去除掉,結尾的空格會被保留 set /p .= hello world! <nul // 與上面命令含義同樣,只是寫法不一樣 <nul set /p= hello world! // 與上面命令含義同樣,只是寫法不一樣 \-------------------------------------- set var=0812 set /a var=1%var%-10000 // var=812 \--------------------------------------
set /a var=39 // 設置var爲數值型變量,值爲39
set /a var=39/10 // 支持運算符,有小數時用去尾法,39/10=3.9,去尾得3,p=3
set /a var=var/10 // 用 /a 參數時,=後的變量能夠不加%直接引用
set /a var="1&0" // &運算要加引號 值爲0
set /a var=1"&"1 // 或者單獨將&運算加引號,值爲1
set /a var=1"^"1 // 異運算,值爲0
set /a var=26"%"3 // 取模運算,值爲2
set /a var=1^<^<5 // 左移位運算(使用^轉義字符修飾<,等價於1"<<"5),2的5次冪,結果32
set /a var=3"<<"2 // 左移位運算,3的二進制爲11,左移2位爲1100,結果爲12
set /a var=4">>"2 // 右移位運算,4的二進制爲100,右移動2位爲1,結果爲1
符號的優先級以下:
() 小括號
! ~ - 一元運算符
* / % 算數運算符
+ - 算數運算符
<< >> 二進制邏輯移位
& 二進制按位「與」
^ 二進制按位「異」
| 二進制按位「或」
= *= /= %= += -= 算數賦值
&= ^= |= <<= >>= 二進制運算賦值
, 逗號表達式分隔符
--------------------------------------
**字符串拼接**
set var1=很好,
set var2=很是好!
set var3=%var1%%var2%
echo %var3% // 輸出:很好,很是好!
``
字符串替換
**%p:str1=str2%** // 將字符串變量%p%中的str1替換爲str2 set p=www. qq. com set var=%p: =% // 去掉p中的空格並賦值給var,值爲www.qq.com echo %var:.=#% // 將var變量中.替換成#,輸出www#qq#com echo %var:*qq=a% // 第一個qq及其以前的全部字符被替換爲a,輸出a.com set time_str=%time% echo %time_str::=-% // 14-21-31.67
**字符串截取
%a:~[m[,n]]% // 符號~能夠簡單理解爲「偏移」,m爲偏移量(缺省爲0),n爲截取長度(缺省爲所有)
set p=www.qq.com
set var=%p:~5% // 從位置5(索引從0開始)開始截取後續字符串並賦值給var,值爲qq.com
echo %p:~5,2% // 從位置5(索引從0開始)開始截取後續2個字符,輸出qq
echo %p:~-3% // 從倒數第3的位置開始截取後續字符串,輸出com
echo %p:~0,-4% // 從頭開始截取後續字符串(最後4個字符不截取),輸出www.qq
set date_str=%date%
echo %date_str:~0,10% // 2019/07/31
延遲變量 形如:!var!
當咱們準備執行一條命令的時候,命令解釋器會將變量的值先讀取出來,而後再運行這條命令。
但有時候,變量的值在該條命令執行過程當中被改變,若是不使用延遲變量就會使用的變量改變前的值,這就不是咱們想要的結果了。
set a=1
set /a a+=1 > nul & echo %a% // 輸出1,不爲2
開啓延遲變量的方法:
(1)cmd下開啓/關閉延遲環境變量:
cmd /v:on //開啓延遲環境變量
cmd /v:off //關閉延遲環境變量
(2)批處理bat文件中開啓/關閉延遲環境變量
setlocal EnableDelayedExpansion //開啓延遲環境變量
setlocal DisableDelayedExpansion //關閉延遲環境變量
如上示例在bat文件中修改爲以下,就能夠輸出2了
setlocal EnableDelayedExpansion
set a=1
set /a a+=1 > nul & echo !a! // 輸出2
系統變量
%random%:獲取[0,32767]之間的隨機整數 例:set /a n=%random% * 100 / 32768 + 1 // 獲取[1,100]之間的隨機整數 例:set /a n=%random% %%100 +1 // 獲取[1,100]之間的隨機整數 %allusersprofile% // 返回「全部用戶」配置文件的位置 %appdata% // 返回默認狀況下應用程序存儲數據的位置 %cd% // 返回當前目錄字符串 %cmdcmdline% // 返回用來啓動當前的 cmd.exe 的準確命令行 %cmdextversion% // 返回當前的「命令處理程序擴展」的版本號 %computername% // 返回計算機的名稱 %comspec% // 返回命令行解釋器可執行程序的準確路徑 %date% // 返回當前日期。使用與 date /t 命令相同的格式 %errorlevel% // 返回上一條命令的錯誤代碼。一般用非零值表示錯誤 %homedrive% // 返回鏈接到用戶主目錄的本地工做站驅動器號。基於主目錄值而設置。用戶主目錄是在「本地用戶和組」中指定的 %homepath% // 返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在「本地用戶和組」中指定的 %homeshare% // 返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是在「本地用戶和組」中指定的 %logonserver% // 返回驗證當前登陸會話的域控制器的名稱 %number_of_processors% // 指定安裝在計算機上的處理器的數目 %os% // 返回操做系統名稱。windows 2000顯示其操做系統爲 windows_nt %path% // 指定可執行文件的搜索路徑 %pathext% // 返回操做系統認爲可執行的文件擴展名的列表 %processor_architecture% // 返回處理器的芯片體系結構。值:x86 或 ia64 基於itanium %processor_identfier% // 返回處理器說明 %processor_level% // 返回計算機上安裝的處理器的型號 %processor_revision% // 返回處理器的版本號 %prompt% // 返回當前解釋程序的命令提示符設置。由 cmd.exe 生成 %systemdrive% // 返回包含系統根目錄的驅動器 %systemroot% // 返回系統根目錄的位置 %temp% %tmp% // 返回對當前登陸用戶可用的應用程序所使用的默認臨時目錄。有些應用程序須要 temp,而其餘應用程序則須要 tmp %time% // 返回當前時間。使用與 time /t 命令相同的格式 %userdomain% // 返回包含用戶賬戶的域的名稱 %username% // 返回當前登陸的用戶的名稱 %userprofile% // 返回當前用戶的配置文件的位置 %windir% // 返回操做系統目錄的位置
errorlevel說明
①設置errorlevel的方法
方法a:使用call命令
@echo off echo exit /B ^2>%temp%\test.bat call %temp%\test.bat echo %errorlevel%//%errorlevel%=2
方法b:使用vbscript腳本
@echo off echo WScript.Quit ^5>%temp%\test.vbs cscript /nologo %temp%\test.vbs echo %errorlevel%//%errorlevel%=5
方法c: 使用windows版的gawk工具
@echo off gawk.exe "BEGIN{exit 12}" echo %errorlevel%//%errorlevel%=12
②開啓延遲變量時,建議使用!errorlevel!來引用變量(雖然在win7下%errorlevel%引用也沒問題)
③echo、set命令不會設置errorlevel的值
④當前整個局部塊中的errorlevel不變,爲上個局部塊最後一個命令的返回碼(相似於:進程main函數的返回值)
⑤判斷errorlevel最好是在全局域中(不要在if、for等語句塊中)
@echo off set var="ok" echo exit /B ^2>%temp%\test.bat call %temp%\test.bat echo %errorlevel%//爲2 if %var%=="ok" ( echo exit /B ^3>%temp%\test2.bat call %temp%\test2.bat echo %errorlevel%//爲2 ) for %%e in (0 1 2 3 4 5 6 7 8 9) do ( echo exit /B ^%%e>%temp%\test3.bat call %temp%\test3.bat echo %errorlevel%//始終爲3 if %%e EQU 9 ( echo exit /B ^99>%temp%\test4.bat call %temp%\test3.bat echo %errorlevel%//始終爲3 ) else ( echo exit /B ^100>%temp%\test5.bat call %temp%\test3.bat echo %errorlevel%//始終爲3 ) ) echo %errorlevel%//爲99
setlocal/endlocal間的系統變量視爲臨時變量
@echo off
setlocal
path=d:\
echo 局部環境變量path值
echo %path% // 輸出:d:\
endlocal
echo 系統環境變量path的值
echo %path% // 輸出系統環境變量%path%的值
3. if命令
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
------------------------------------
net user
if %errorlevel%==0 echo net user 執行成功了!
------------------------------------
xcopy from.txt to.txt
if errorlevel 0 echo 文件複製沒有錯誤! // if errorlevel 0表示errorlevel>=0;所以當from.txt文件不存在時,errorlevel=4,仍然會打印:文件複製沒有錯誤!
------------------------------------
xcopy from.txt to.txt
if %errorlevel%==0 (echo 文件複製沒有錯誤!) else echo 文件複製出錯!
------------------------------------
xcopy test.bat to.txt
if %errorlevel% == 0 (
echo 文件複製沒有錯誤!
) else (
echo 文件複製出錯!
)
------------------------------------
set /p v1=請輸入第一個比較字符:
set /p v2=請輸入第二個比較字符:
if %v1% == %v2% (echo v1等於v2.) else echo v1不等於v2. // 會將v1與v2的先後空格去掉後,進行比較(大小寫敏感)
------------------------------------
set /p v1=請輸入第一個比較字符:
set /p v2=請輸入第二個比較字符:
if "%v1%" == "%v2%" (echo v1等於v2.) else echo v1不等於v2. // 不進行空格處理,直接對v1與v2進行比較(大小寫敏感)
------------------------------------
set /p v1=請輸入第一個比較字符:
set /p v2=請輸入第二個比較字符:
if /i "%v1%" == "%v2%" (echo v1等於v2.) else echo v1不等於v2. // 不進行空格處理,直接對v1與v2進行比較(大小寫不敏感)
------------------------------------
set /p var=請輸入一個數字:
if %var% LEQ 5 (echo var小於等於5.) else echo var大於5.
還有一些用來判斷數字的符號:
EQU - 等於
NEQ - 不等於
LSS - 小於
LEQ - 小於或等於
GTR - 大於
GEQ - 大於或等於
------------------------------------
set var=
if not defined var (echo 變量var未定義.) else echo 變量var存在.
------------------------------------
set var=
if [%var%] == [] (echo 變量var爲空.) else echo 變量var不爲空.
------------------------------------
if not exist "c:\test" (
echo 不存在test文件夾!
md "c:\test"
) else (
echo 存在test文件夾!
rd "c:\test"
)
------------------------------------
4. goto命令
@echo off if "%1" == "" goto x86 if not "%2" == "" goto usage if /i %1 == x86 goto x86 if /i %1 == x64 goto x64 goto usage :x86 if not exist "%~dp0bin\vcvars32.bat" goto missing call "%~dp0bin\vcvars32.bat" goto :eof :x64 if not exist "%~dp0bin\amd64\vcvarsamd64.bat" goto missing call "%~dp0bin\amd64\vcvarsamd64.bat" goto :eof :usage echo Error in script usage. The correct usage is: echo %0 [option] echo where [option] is: x86 ^| x64 echo: echo For example: echo %0 x86 goto :eof :missing echo The specified configuration type is missing. The tools for the echo configuration might not be installed. goto :eof
5 子程序調用
@echo off call :fun return 你好 // 調用fun子程序,並傳入2個參數 echo 子程序返回值:%return% // return此時爲一個變量,其值爲:你好 pause goto :eof :fun echo ++%1++ ++%2%++ // 輸出:++return++ ++你好++ set %1=%2 goto :eof
5. for命令
for %%i in (c:\*) do echo %%i // 打印出c盤根目錄下的全部文件(不遞歸子目錄) **FOR /D %%variable IN (set) DO command [command-parameters]** for /d %%i in (c:\*) do echo %%i // 打印出c盤根目錄下的全部文件夾(不遞歸子目錄) **FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]** for /r "c:\" %%i in (*.exe) do echo %%i // 將C盤根目錄(遞歸子目錄)下全部exe文件的路徑都列出來 \------------------------------------ for /r %%i in (*.doc *.xls) do echo %%i // 將當前目錄(遞歸子目錄)下全部doc文件和xls文件的路徑都列出來 \------------------------------------ for /r "c:\" %%i in (notepad.exe) do if exist %%i echo %%i // 將C盤根目錄(遞歸子目錄)下包含notepad.exe文件的路徑都列出來 **FOR /L %%variable IN (start,step,end) DO command [command-parameters]** for /l %%i in (1,2,5) do @echo %%i // (1,2,5):(start,step,end);打印出:1 3 5 \------------------------------------ for /l %%i in (1,1,5) do ( md Dir_%%i echo 建立Dir_%%i... ) // 在當前目錄下,新建名爲Dir_一、Dir_二、Dir_三、Dir_四、Dir_5五個新目錄 \------------------------------------ set s=AA BBB CCCC D for %%a in (%s%) do echo %%a // 遍歷s字符串,共循環4次,打印出AA、BBB、CCCC、D \------------------------------------ **FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]** **FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]** **FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]** echo 01段 02段 03段 04段 05段 06段 >"C:\Program Files\test.txt" echo ;註釋行,這是臨時文件,僅僅用於測試 >>"C:\Program Files\test.txt" echo ;kekec 20140901 >>"C:\Program Files\test.txt" echo 11段 12段 13段 14段 15段 16段 >>"C:\Program Files\test.txt" echo 21段,22段,23段,24段,25段,26段 >>"C:\Program Files\test.txt" echo 31段-32段-33段-34段-35段-36段 >>"C:\Program Files\test.txt" for /f "skip=1 eol=; tokens=1,3* delims=,- usebackq" %%i in ("C:\Program Files\test.txt") do echo %%i %%j %%k
輸出結果:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
------------------------------------
skip:1 表示忽略開頭的一行內容 eol指明;開頭的爲註釋行,處理時會被忽略 tokens=1,3*表示%%i %%j %%k分別表明一行中的第1個字段、第3個字段及第3個字段後的全部內容(從%%i開始命名是由於%%i in ("C:\Program Files\test.txt")),如有第4個字段第5個字段,則爲%%l、%%m,以此類推! delims指明逗號、減號、空格爲分割符,默認是空格和tab爲分割符 usebackq 使用後引號(鍵盤上數字1左面的那個鍵`)。 未使用參數usebackq時:file-set表示文件,但不能含有空格;雙引號表示字符串,即"string";單引號表示執行命令,即'command' 使用參數usebackq時:file-set和"file-set"都表示文件(當文件路徑或名稱中有空格時,就能夠用雙引號括起來);單引號表示字符串,即'string';後引號表示命令執行,即`command` for /f "tokens=1,2*" %%i in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul') do set MyDocument=%%k//%MyDocument%爲當前用戶的個人文檔路徑(如:C:\Users\James\Documents) for變量擴展加強 注:delims==及delims=表示不要分割符 for /f "delims==" %%i in ('dir /b') do @echo %%~i // 刪除引號" (1)若字符串首尾同時存在引號,則刪除首尾的引號;(2)若字符串尾不存在引號,則刪除字符串首的引號;(3)若是字符串中間存在引號,或者只在尾部存在引號,則不刪除。 for /f "delims==" %%i in ('dir /b') do @echo %%~fi // 將文件或目錄名擴展到一個徹底合格的路徑名 for /f "delims==" %%i in ('dir /b') do @echo %%~di // 將文件或目錄名擴展到一個驅動器號 for /f "delims==" %%i in ('dir /b') do @echo %%~pi // 將文件或目錄名擴展到一個路徑 for /f "delims==" %%i in ('dir /b') do @echo %%~ni // 將文件或目錄名擴展到一個文件名 for /f "delims==" %%i in ('dir /b') do @echo %%~xi // 將文件或目錄名擴展到一個文件擴展名,目錄不存在擴展名,會輸出錯誤提示:ECHO 處於關閉狀態。 for /f "delims==" %%i in ('dir /b') do @echo %%~si // 將文件或目錄名擴展到一個短路徑名 for /f "delims==" %%i in ('dir /b') do @echo %%~ai // 擴展到文件屬性 形如:--a------ for /f "delims==" %%i in ('dir /b') do @echo %%~ti // 擴展到文件或目錄的修改日期時間 for /f "delims=" %%i in ('dir /b') do @echo %%~zi // 擴展到文件或目錄的大小(單位:byte),目錄返回的大小貌似不對 for /f "delims=" %%i in ("notepad.exe") do echo %%~$PATH:i // 在PATH變量裏指定的路徑裏搜索notepad.exe文件,若是有notepad.exe則把絕對路徑打印出來,沒有會輸出錯誤提示:ECHO 處於關閉狀態。
6 綜合應用
(1) win7下修改dsw文件的關聯圖標
在xp下,咱們能夠經過文件夾選項 --文件類型 -- 選中要修改的文件類型,而後點「高級」 -- 更改圖標來達到目的,然而win7下已經不提供這種修改方法了。
@echo off rem 獲取dsw的文件類型 set dswcmd=reg query HKCR\.dsw /ve for /f "tokens=1,2,3 usebackq" %%i in (`"%dswcmd%"`) do @set dswconf=%%k rem 設置dsw的文件類型的缺省圖標爲msdev.exe的圖標 set dswicon=HKCR\%dswconf%\DefaultIcon for /f "delims=" %%i in ("msdev.exe") do @set msdevpath=%%~$PATH:i reg add %dswicon% /t REG_SZ /d "\"%msdevpath%\",-20214" /f rem 關聯Progid到dsw的文件類型 reg add HKCU\software\microsoft\windows\currentversion\explorer\fileexts\.dsw\userchoice /v Progid /t REG_SZ /d "%dswconf%" /f
具體關聯exe中的那個圖標資源,可使用Resource Hacker工具來查詢,以下:
(2) 將腳本sleep兩秒後再執行(時間精度:0.001秒)
@echo off set tmpvbs=%temp%\tmp$$$.vbs echo WScript.Sleep 2000 > %tmpvbs% echo %time% cscript /nologo "%tmpvbs%" echo %time% if exist "%tmpvbs%" del /f /q "%tmpvbs%"
(3) 使用ping命令來模擬暫停5秒後再執行(時間精度:1秒)
ping /n 1 /w 5000 1.1.1.2 // 注:1.1.1.2爲一個永遠沒法達的IP地址 /n 1:表示嘗試次數爲1;/w 5000:表示超時時間爲5000毫秒
(4) 模擬進度條
@echo off mode con cols=113 lines=15 &color 9f cls echo. echo 程序正在初始化. . . echo. echo ┌──────────────────────────────────────┐ set /p=" -■"<nul for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 2 127.0.0.1>nul echo 100%% echo └──────────────────────────────────────┘
注:ping /n 2 127.0.0.1的執行時間爲1秒;ping /n 2 127.0.0.1>nul表示不將執行結果打印到屏幕上
(5) 強制結束指定路徑下的進程及其子進程
@echo off setlocal enabledelayedexpansion set processname=client.exe set processpath=D:\NZTest\體驗服\TCLS set "str=wmic process where caption="%processname%" get ExecutablePath^,ProcessId" for /f "skip=1 tokens=*" %%i in ('!str!') do ( for /f "tokens=1-2" %%a in ("%%i") do ( if /i "%%a"=="%processpath%\%processname%" (taskkill /F /PID %%b /t) ) )
注1:進程路徑和進程名稱中不能有空格
注2:只結束"D:\NZTest\體驗服\TCLS"目錄下的全部名爲client.exe進程
(6) 強制結束指定參數及指定路徑下的進程及其子進程
@echo off setlocal enabledelayedexpansion set /a matchName=0 set /a match=0 set pid="" set LastFullPath="" set getFullPath="" set processnames=UE4Editor.exe UE4Editor-Win64-DebugGame.exe UE4Editor-Win64-Debug.exe set processpath=D:\svn\UnrealEngine\Engine\Binaries\Win64 set arg=" -hello" for %%m in (%processnames%) do ( set "str=wmic process where caption="%%m" get CommandLine^,ExecutablePath^,ProcessId" echo !str! for /f "skip=1 tokens=*" %%i in ('!str!') do ( set /a matchName=0 set /a match=0 for %%a in (%%i) do ( set pid=%%a set LastFullPath=!getFullPath! set getFullPath=%%a ) if /i "!LastFullPath!"=="%processpath%\%%m" (set /a matchName=1) if !matchName!==1 ( echo %%i | findstr /c:!arg! 1>nul if not errorlevel 1 (set /a match=1) ) if !match!==1 (taskkill /F /PID !pid! /t) ) )
注1:進程路徑和進程名稱中不能有空格
注2:只結束"D:\svn\UnrealEngine\Engine\Binaries\Win64"目錄下的全部名爲UE4Editor.exe或UE4Editor-Win64-DebugGame.exe或UE4Editor-Win64-Debug.exe且參數中含有" -hello"字符串的進程(參數字符串區分大小)
(7) 重建win7圖標緩存
@echo off rem 關閉Windows外殼程序explorer taskkill /f /im explorer.exe rem 清理系統圖標緩存數據庫 attrib -h -s -r "%userprofile%\AppData\Local\IconCache.db" del /f "%userprofile%\AppData\Local\IconCache.db" attrib /s /d -h -s -r "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\*" del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_32.db" del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_96.db" del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_102.db" del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db" del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_1024.db" del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_idx.db" del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_sr.db" rem 清理系統托盤記憶的圖標 reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v IconStreams /f reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v PastIconsStream /f rem 重啓Windows外殼程序explorer start explorer
(8) 修復win7桌面圖標黑塊
@echo off reg delete "hkcu\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /f reg delete "hklm\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /f taskkill /f /im explorer.exe & start explorer.exe
(9) 刪除沒有svn受控的目錄及文件
@echo off setlocal EnableDelayedExpansion for /f "tokens=1,*" %%i in ('svn.exe status "D:\Client\Assets"') do ( if %%i==? ( if exist "%%j\*" ( echo 刪除目錄 - %%j rd /s /q "%%j" ) else ( del /f /s /q "%%j" ) ) )