cmd command1

echo命令

1 echo.輸出空行

即相當於輸入一個回車,echo後面的點要緊挨一起,中間不能有空格,後面的點可以用,:;/[ \ ]+等任一符號替代。即:下面的命令都是輸出空行:

echo.
echo,
echo:
echo;
echo/
echo\
echo[
echo]
echo+

2 函數:

函數以一個標籤開始,並以goto:eof結束

函數的調用以call開始,以goto:eof結束

@echo off
echo begin
call:myf1
echo end
echo.&goto:eof

::----
rem 函數開始部分
::----

:myf1
echo function start
echo.
echo function end
goto:eof

編寫帶參數的函數
採用%1%9來代表參數的值。而%0表示批處理文件本身,當然,如果傳遞的參數是“xxx”形式,而要獲取的參數值爲xxx,則需要使用%1形式的參數。

:myFunction
echo it could do %~1 of things %~2
goto:eof

調用時給函數傳參
(參數直接放在函數後面,用空格或逗號分隔)
1.用空格或者逗號將參數分開
2.用雙引號將帶有空格的字符串參數括起來
比如下面的例子


@echo off
call:myFunction 100 hello
call:myFunction 100,hello
call:myFunction 100,"hello"
call:myFunction 100 "hello world"
echo.&pause&goto:eof
 
:myFunction
echo.
echo it could do %1 of things %2
echo it could do %~1 of things %~2
goto:eof

下面看幾個例子:
例1 求fibonacco函數,編寫fib.bat如下:

@echo off
setlocal enabledelayedexpansion
call:fib %1
goto:eof

:fib
set a1=1 & set a2=1
for /l %%i in (3,1,%1) do (
    set /a t=a2
    set /a a2=a1+a2
    set /a a1=t
)
echo %a2%
goto:eof

例2 求jiecheng函數,編寫jiecheng.bat.

@echo off
rem setlocal enabledelayedexpansion
call:jiecheng %1
goto:eof

:jiecheng
set res=1
for /l %%i in (2,1,%1) do (
    set /a res=res*%%i
)
echo %res%
goto:eof

3 變量的設置與引用

調用函數後不像其他語言那樣能有返回值,最常用的做法是先用set定義一個全局變量,然後在函數中使用該全局變量並將需要的值保存在全局變量中
直接用該全局變量。

set a=5
echo %a%

表達式類型的變量(set /a)

set /a var=2 - 1
set /a var=2 * 2
set /a var=2 / 2
set /a var=(1+1) + (1+1) 
set /a a=1+1,b=2+1,c=3+1
set /a var+=1
set /a var*=2

運算符

() 分組
! ~ - 一元運算符
* / % 算數運算符
+ - 算數運算符

= *= /= %= += -= 賦值
&= ^= |= <<= >>= 表達式分隔符

對於邏輯或取餘操作符,使用的時候需要添加引號才能正常使用,否則報錯
<< >> 邏輯移位
& 按位“與”
^ 按位“異或”,
| 按位“或”

dos1

&&,||,&,|運算符

&& 順序執行多條命令,當碰到執行出錯的命令後將不執行後面的命令

|| 順序執行多條命令,當碰到執行正確的命令後將不執行後面的命令(即:只有前面命令執行錯誤時才執行後面命令)

&  順序執行多條命令,而不管命令是否執行成功

|  管道命令 前一個命令的執行結果輸出到後一個命令 如:help|more

> 清除文件中原有的內容後再寫入

>> 追加內容到文件末尾,而不會清除原有的內容主要,指定文件如果不存在,則自動生成該文件
例1:copy nul 5.txt & echo 666 >>5.txt & more 5.txt

創建5.txt文檔,向5.txt文檔中寫入內容“666”,輸出5.txt的內容。

比較下面&和&&的不同:
dos2

4 邏輯與或非的實現

4.1、非

這個有現成的,條件判斷前加not,例如:

C:\Users\HW>if 1==1 echo Ok  
Ok

C:\Users\HW>if not 1==1 echo Ok

C:\Users\HW>

4.2、與

這個變通實現也還算簡單:

C:\Users\HW>if 1==1 if 2==2 echo Ok  
Ok

C:\Users\HW>if 1==1 if 2==3 echo Ok

C:\Users\HW>

較爲清晰的寫法:

if 1==1 (if 2==2 echo Ok)
if 1==1 (if 2==3 echo Ok)

4.3、或

dos不支持邏輯或,這個實現起來就比較繁瑣了,網上可找到如下幾種:(1)用多個if嵌套的;(2)用2個條件語句給一個變量賦值,再判斷該變量的;(3)用for循環的。

這些做法都顯得太麻煩。其實,直接用GOTO語句最簡單,例如,下面的程序邏輯實現只輸入1個參數或2個參數都不輸入時,打印幫助信息:

if "%1"=="" goto printHelp

if "%2"=="" goto printHelp

:printHelp

@echo This is a help message, please refere to ...

5 字符串操作

字符串替換(=)
%PATH:str1=str2%這個操作就是把變量%PATH%裏的str1全部用 str2替換。
實例:
dos3

字符串截取(~)

::從下標1對應的位置開始,截取4位字符(下標從0開始)
set c=%b:~1,4%
echo %c%
 
::從第2位開始截取,截止倒數第4位
set f=%b:~1,-4%
echo %f%
 
::截取3對應的下標到末尾的字符
set e=%b:~3%
echo %e%
 
::截取-3對應的下標到末尾的字符,即倒數3位
set d=%b:~-3%
echo %d%

再看一個例子:
dos4

函數的局部變量
局部變量放在SETLOCAL與ENDLOCAL之間定義。
SETLOCAL可以很好的保護函數內與外面的變量不會衝突。即:

setlocal
set var1=xxx
set var2=xxx
endlocal
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章