windows批處理語法


寫批處理文件,除了了解基本語法外,你還需要熟悉常用的windows命令,那就先看看這篇文章:windows常用命令

#重要說明

文件及目錄路徑:要使用反斜杠'\',不要使用正斜杠'/' 如:del d:\test2\file\my.txt
文件及目錄路徑:若存在空格,應使用雙引號將路徑引起來 如:del "d:\program files\file\my.txt"
文件及目錄名中不能包含下列任何字符:\ / : * ? " < > |

0. 參數

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

process.bat

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可以結束命令執行)

work.bat

@echo off
net user
%0

1. 常用特殊符號

& 順序執行多條命令,而不管命令是否執行成功
例: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. 變量

dos計算說明:

(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_1、Dir_2、Dir_3、Dir_4、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"
        )
    )
)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM