Posts

Showing posts from August, 2016

DOS指令 -- SET和變數

DOS指令 -- SET變數

Dos的SET功能很強大也很困擾,這邊說一下筆者會用到的SET功能和變數


在Dos中,set用來建立變數和指定變數的值
在批次檔中使用set指令的時候,建議使用 setlocal/endlocal
如 :
setlocal
set a=1
set b=2
endlocal

如果有用到IF或FOR,可以使用參數enableextensions enabledelayedexpansion
如 :
setlocal enableextensions enabledelayedexpansion
for /L %%a in (1,1,3) do (
set a=!a!+%%a
)
echo %a%
endlocal
實際的使用方式可以參考 --這裡--



SET的基本功能

指定變數
set aaa=World!!
set bbb=100

set後面加上的文字是變數, "=" 後面的任何文字就是這個變數的值
如果輸入的是數字,SET會自動判斷。如果數字的第一個字是 0 會被判定為8進位,如 : 07
注意 : =符號的前後不要空白,會被判定為文字



變數四則運算
set /a aaa=5+6
 aaa=11

set /a x=5%%2        //在set /?裡面是寫一個%,如果是在批次檔內要用兩個%
x=1

set /a bbb=2*(5+2)
bbb=14

set ccc=4
set /a ccc*=5       //這個等於 ccc=%ccc%*5
ccc=20

set x=5
set y=2
set /a x-=%y%-1
x=4

在set後面加上 /a ,就可以進行運算相對應的符號有 + 加號,- 減號, / 除號, * 乘號
%% 為除完後的餘數
( )內的運算會優先執行,就跟真實環境的四則運算一樣
如果要自己對自己運算(如第三個例子),可以把運算符號放在 = 的前面
第四個例子比較特別,會先把=號右邊算完,才會進行 -=的運算



讓使用者自行填入變數

set /p x=請填入生日:
echo %x%

輸出:
請填入生日: 1234  <--1234是筆者填入的數字
1234



SET擴充的功能

取代

%變數:find=replace%

set x=Haco
set x=%x:ac=ell%
x=Hell…

DOS指令 -- FOR迴圈

DOS指令  --  FOR迴圈


因為最近有在寫Dos的指令,有感而發寫一些自己有在用的東西

先解釋基本的For指令
再說明遞增/遞減的 For迴圈和搜索檔案用的迴圈
最後就是筆者最常用的For迴圈


For指令常常用在重複執行類似的動作


如 :
在字串最後面加上數字
像是 :
朋友1
朋友2
朋友3

執行指令並依序處理傳回的文字
執行 dir 並比對回傳的檔案
開啟文字文件依序讀取每一行的文字,並依不同狀況執行


後兩種是我最常使用的功能,先介紹基本的 For 指令的使用方式


FOR %%a IN (香蕉,你的,巴拉) DO ( echo %%a ) 輸出會像:

香蕉

你的

巴拉

(  ) 內的東西都用光以後,迴圈就會自動結束。
而每次取得的值,這個值會存在變數 %%a 裡面,並可以在 DO 後面的 ( ) 內執行指令

說明一下每個指令的意思
FOR -- 要開始一個For迴圈最前面一定需要的文字 For

%%a -- 用來儲存For迴圈產出的值,這個變數可以由使用者自行決定,可以是 %%b 或 %%g。
             前面一定要有兩個%%後面加上一個英文字。注意 : 這個英文字有大小寫之分
             在這個例子中用來儲存 香蕉.....

IN -- 指令文字,後面一定要接  (香蕉...) <- (裡面可以放很多東西)

(香蕉...) -- 文字串,在For裡面依序使用的東西 (後面會說到裡面還可以放檔案、指令)

DO -- 指令文字, 後面一定要接 (echo  ....)

(echo  ....) -- 要執行的指令,在這裡可以使用For的變數 %%a。
                     如果指令有兩個以上可以像例子中一樣用 ( ) 包起來。




以上就是最基本的For,接著說明數字的遞增和遞減


數字的遞增和遞減

For /L %%a in (start,step,stop) DO ( Do something)


例子
For /L %%a in (1,2,7) DO ( echo %%a )
輸出 :
1
3
5
7




/L -- For後面可以下不同的參數,這會改變For對 IN 後面的 ( ) 所做的動作。
        /L 會讓For 認定 ( ) 內的是數字,並且是遞增或遞減
start -- 起始數字,Fo…