BAT 學習筆記

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
遍歷文件夾:

  1. 先查文件夾下的.ccz 加了/s會遍歷子文件夾,加了/b 只顯示文/夾名
  2. 用 in(*.ccz) 的話可以不 /f 但是這樣不知道怎麼 遍歷子文件夾了
  3. 然後再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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章