bat中幾個要搞清楚的東西(一)

2021-10-06 05:08:24 字數 2186 閱讀 9313

bat中enabledelayedexpansion用來設定變數的延遲擴充套件,通過以下語句可以開啟延遲擴充套件,

setlocal enabledelayedexpansion
這樣設定後變數的擴充套件時間將發生在execution時而不是變數 parse時,可以通過下邊的例子看出其作用。

@echo off

setlocal

set "_var=first"

set "_var=second"

& echo %_var%

此例子不使用enabledelayedexpansion,輸出為:first,也就是說set "_var=second"像是沒有發生作用一樣。

@echo off

setlocal enabledelayedexpansion

set "_var=first"

set "_var=second"

& echo !_var!

這個例子中我們開啟delayedexpansion開關,則輸出second, 這樣更符合我們對指令碼的輸出預期。

對字串變數的擷取操作,

前n個字元

%str:~0,n%

去掉最後n個字元後的字串

%str:~0,-n%

第m個字元開始的n個字元

%str:~m-1,n%

倒數第n個字元為

%str:~-n,1%

倒數第n個及其之後的字元為

%str:~-n%

倒數第n個開始的m個字元為

%str:~-n,m%

goto改變了bat指令碼自上而下的執行順序,將程式的執行跳轉到冒號指定的標籤處,並從此處往下執行。

callqoto比較類似,也是改變指令碼的執行順序,將程式跳轉到指定標籤。但是,如果使用的是call,則再跳轉後遇到exiteof時,指令碼的執行將回到call的呼叫處,即執行call的下邊那條指令。

另外,call·還可以傳遞引數,在跳轉到的標籤中,%1`即傳遞的第乙個引數。

退出碼errorlevel為上乙個執行程式的退出碼(exit code).如果執行的是乙個不存在的程式或命令,則這個退出碼會被設定為9009.

exit code的檢測與編寫高階語言的習慣可能有點兒不一樣,比如下邊的語句,

if errorlevel 1 echo exit code 1?

exit code 1?被列印出來,並不意味著errorlevel等於1,而是說明此時errorlevel>=1

那麼我們怎麼能像高階程式語言那樣直接進行相等性判斷呢?答案如下,

if errorlevel n if not errorlevel n+1 command

我們可以自己定義乙個變數叫errorlevel麼?答案是可以,此時會發生類似c語言中區域性變數和全域性變數的事情(但不完全一樣),比如我們建立了乙個變數errorlevel,

set errorlevel=1

if errorlevel 1 echo hello ^_^

我們將看不到hello ^_^的輸出,因為我們設定的是errorlevel這個變數的值是1,而這個變數並不是退出碼,退出碼儲存的仍然是上乙個程式的exit code!!

如果我們判斷使用的是%errorlevel%而不是errorlevel呢?

那麼,指令碼會先查詢有沒有errorlevel這個變數,若找到這個變數了,就用這個變數,找不到就用退出碼。

要搞清楚物件和物件的引用

有很多程式設計師還在寫這樣的 user user new user user userdao.selectuserbyid id user.getname 他的理由是,為了防止執行user.getname 時發生空指標異常,所以先new出乙個物件,這樣即使從資料庫裡查詢不到對應id的使用者,程式也不...

MySQL 你要搞清楚儲存引擎之間的差別,喲

目錄 1.概況對比 2.索引對比 2.1 innodb 2.1.1 聚集索引 2.2 myisam 3.事務 4.鎖對比各個儲存引擎之間的特性 特性innodb myisam memory merge ndb事務 外來鍵 鎖粒度 行鎖表粒度表表 行索引b 樹集群索引 b 樹全文索引 b 樹雜湊 b ...

C 搞清楚類中構造與析構的順序

定義乙個類物件時,首先根據初始化列表初始化類的成員 就算沒有顯式定義初始化列表,編譯器也會預設地初始化一次 然後執行建構函式。因此,類成員的建構函式必定先於類的建構函式執行。class a a class b b class d d class x virtual x virtual void te...