Windows bat 編程基本語法

windows批處理語法

寫批處理文件,除了瞭解基本語法外,你還須要熟悉經常使用的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工具來查詢,以下:

imgimg

(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"
        )
    )
)
相關文章
相關標籤/搜索