BAT變量:
set 不能用在複合語句裏面
比如 `if 1==1 set a=2`
比如 `for %%i in (a) do set a=2`
::兩個冒號後是註釋,當然BAT註釋好幾種,我覺得這個最符合我的需要
::@本行不顯示 Echo off 從此以後都不顯示
@Echo off
::變量用set 聲明並賦值(a=之間不能TMA的有空格,我被這個坑過)
::調用時%a%取出變量值
set a= 111
echo %a%
:: 取消變量。取消後的變量若被引用%變量名%將爲空
set 變量名=
::列出所有以XX爲前綴變量
set xx
::列出所有可用變量
set
::計算器
格式:set /a 表達式
示例:set /a 1+2*3 輸出 7
::設置變量爲表達式計算後的值
set a=1+2
echo %a% ==>輸出1+2
------------------------------------
set /a a=1+2
echo %a% ==>輸出3
::設置變量爲用戶輸入的值
set /p a=輸入一個值 ==>輸出 輸入一個值
echo %a% ==>顯示用戶輸入的值
::暫停
pause
字符提取:
比如執行echo %time%
得到的顯示時間爲 18:57:44.10
即18點57分44秒10毫秒;
%time:~0,2% 是提取%time%中的前兩個字符,即小時值;
%time:~3,2% 是從%time%中的第三個字符後開始提取兩個字符,即分鐘值;
%time:~6,2% 是從%time%中的第六個字符後開始提取兩個字符,即秒數值;
字符提取問題可以set/?
查看中文幫助
舉個例子吧!
set str=MyNameIsLuHongLein
echo %str:~2,4% //提取str中第二個字符後的四個字符,即顯示 Name
echo %str:~-10% //顯示str中最後十個字符,即 LuHongLein
echo %str:~2,-10% //從第二個字符後開始提取,但去除最後的十個字符,將顯示 NameIs
BAT變量說明:
下面是網上抄來的常見的
set 功能一覽
[設置變量]
格式:set 變量名=變量值
詳細:被設定的變量以%變量名%引用
[取消變量]
格式:set 變量名=
詳細:取消後的變量若被引用%變量名%將爲空
[展示變量]
格式:set 變量名
詳細:展示以變量名開頭的所有變量的值
[列出所有可用的變量]
格式:set
[計算器]
格式:set /a 表達式
示例:set /a 1+2*3 輸出 7
[設置變量爲表達式計算後的值]
set a=1+2
echo %a% ==>輸出1+2
------------------------------------
set /a a=1+2
echo %a% ==>輸出3
[設置變量爲用戶輸入的值]
set /p a=輸入一個值 ==>輸出 輸入一個值
echo %a% ==>顯示用戶輸入的值
!注意!
set不能用在複合語句裏面比如if 1==1 set a=2或者for %%i in (a) do set a=2
() - 分組
! ~ - - 一元運算符
* / % - 算數運算符
+ - - 算數運算符
<< >> - 邏輯移位
& - 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
, - 表達式分隔符
預定義的變量
下面是些已經被底層定義好可以直接使用的變量:不會出現在 SET 顯示的變量列表中
%CD% - 擴展到當前目錄字符串。
%DATE% - 用跟 DATE 命令同樣的格式擴展到當前日期。
%TIME% - 用跟 TIME 命令同樣的格式擴展到當前時間。
%RANDOM% - 擴展到 0 和 32767 之間的任意十進制數字。
%ERRORLEVEL% - 擴展到當前 ERRORLEVEL 數值。
%CMDEXTVERSION% - 擴展到當前命令處理器擴展名版本號。
%CMDCMDLINE% - 擴展到調用命令處理器的原始命令行。
%0 bat的完整路徑名如"C:\Windows\system32\xxx.bat"
%1 bat參數1依次類推%2參數2...
%path% - 當前的環境變量。以分號隔開的路徑列表,路徑可包含空格,可以以'\'結尾, 可以以雙引號包圍之。
擴展變量
與%i相關的變量(bat參數或者for循環的%i)
假設文件爲C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%0 C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%~dp0 C:\Documents and Settings\jinsun\桌面\
%cd% C:\Documents and Settings\jinsun\桌面
%~nx0 ParseSinglePkgs.bat
%~n0 ParseSinglePkgs
%~x0 .bat
BAT變量擴展——文件名提取:
FOR命令中有一些變量,他們的用法許多新手朋友還不太瞭解,今天給大家講解他們的用法!
先把FOR的變量全部列出來:
FOR /F %%i in ('set') DO @echo %%i
~i -刪除任何引號("),擴展%i
%~fi -將%i擴展到一個完全合格的路徑名
%~di -僅將%i擴展到一個驅動器號
%~pi -僅將%i擴展到一個路徑
%~ni -僅將%i擴展到一個文件名
%~xi -僅將%i擴展到一個文件擴展名
%~si -擴展的路徑只含有短名
%~ai -將%i擴展到文件的文件屬性
%~ti -將%i擴展到文件的日期/時間
%~zi -將%i擴展到文件的大小
%~$PATH:i -查找列在路徑環境變量的目錄,並將%i擴展
到找到的第一個完全合格的名稱。如果環境變量名
未被定義,或者沒有找到文件,此組合鍵會擴展到
空字符串
我們可以看到每行都有一個大寫字母i
,這個i
其實就是我們在FOR
帶入的變量,我們FOR
語句代入的變量名是什麼,這裏就寫什麼.
比如:FOR /F %%a in ('set') DO @echo %%a
這裏我們代入的變量名是a
那麼我們就要把那個i
改成a
,例如%~fi
改爲%~fa
這段是從 李sir_Blog 轉來的,那裏還有更多的 bat 教程。
@echo off
set var=c:\aaa\bbb\ccc\文件名.擴展名
for /f "delims=" %%i in ("%var%") do (
echo %%~ni
echo %%~xi
echo %%~nxi
)
pause
pause
%%~ni 代表 文件名
%%~xi 代表文件 .擴展名 (注意是有點的)
%%~nxi 代表 文件名.擴展名
@echo off
for %%i in (*.xls) do (
echo 文件名: %%~ni 擴展名:%%~xi
)
pause::輸出如下:
%%~ni 測試文件
%%~xi .xls
@ 與%VAR%相關的變量%VAR:str1=str2% 會將VAR中的str1替換爲str2(str2如果爲空則可以達到刪除的效果,str1前可以加*,變量%ABC:*B=%是C)%VAR:~0,-2% 會提取VAR 變量的所有字符,除了最後兩個%VAR:~2% 會提取VAR 變量的除前兩個的所有字符%VAR:~-2% 會提取VAR 變量的最後兩個%VAR:~2,5% 提取從第2個字符開始的5個字符
批處理中分割字符串【轉】
把一個字符串按照特定的字符分割成多個子字符,一般的編程語言中都提供內置的方法來實現這個功能,在批處理中可以通過命令for來完成。命令格式如下:
for /f "tokens=x,y,m-n delims=chars" %%a in ("str") do cmd
其中tokens獲取分割後字符串的列數,列數從1開始技術,可以指定多個,中間用“,”分割。tokens設置具體含義如下:
tokens=x 表示只提取第x列。
tokens=x,y 表示只提取第x列和第y列。
tokens=m-n 表示提取第m列至第n列。
tokens=x* 表示提取第x列和後面所有字符串都作爲第x+1列。
tokens=x,* 等同tokens=x*
tokens=x,y,m-n 表示提取第x,y列以及第m至第n列。
delims是指定風格字符,可以指定多個,例如:delims=xy,表示以x或者y作爲分隔符。注意:tokens和delims必須在同一對引號中。
tokens參數決定了輸出變量的個數,%%a表示第一個變量引用,%%b表示第二個變量引用,依次類推。也可以指定第一個變量爲%%m、%%n等,總之下一個變量字符是上一個變量的ascii碼值加1。
一個簡單例子如下:
@echo off
set str=100x200x300y400y500x600y700
for /f "tokens=1,3-5,* delims=x|y" %%a in ("%str%") do (
set c1=%%a
set c3=%%b
set c4=%%c
set c5=%%d
set c6=%%e
)
echo %c1%, %c3%, %c4%, %c5%, %c6%
pause
輸出結果爲:100, 300, 400, 500, 600y700。其中tokens=1,3-5,表示提取第1、3至5列,同時把第5列後所有剩餘字符串作爲第6列,一個輸出了5個變量,也可以寫作tokens=1,3,4,5,。
遍歷文件夾
情景:文件裏有一堆 文件名.pvr.ccz 文件,要找出來改成png
遍歷文件夾:
- 先查文件夾下的.ccz 加了/s會遍歷子文件夾,加了/b 只顯示文/夾名
- 用 in(*.ccz) 的話可以不 /f 但是這樣不知道怎麼 遍歷子文件夾了
- 然後再for一次去掉.pvr
@echo off
for /f %%i in ('dir /b/s *.ccz') do (
for /f "tokens=1,* delims=." %%a in ("%%i") do (
gametools pvr -save in#%%a.pvr.ccz out#%%a.png
del %%i
)
)
pause
@echo off
for %%i in (*.plist) do (
echo 文件名: %%~ni.plist
gametools plist -unpack in#%%~ni.plist out#%%~ni
)
pause
遍歷輸出拖拽上來的文件
@echo off
for %%i in (%*) do (
echo %%i
echo.
)
pause
遍歷當前目錄及子目錄
@echo off
for /f "delims=" %%i in ('dir /b/s *.*') do (
echo %%i
)
pause