12/08/2018, 15:54

Batch script (2)

Tiếp tục bài viết về Batch script này. String Tạo string Khởi tạo string trong dos @echo off :: This program just displays Hello World set message=Hello World echo %message% Đoạn code này sẽ in ra Hello World Empty String Để kiểm tra 1 string empty hay không, chúng ta dùng ...

Tiếp tục bài viết về Batch script này.

String

Tạo string

Khởi tạo string trong dos

@echo off 
:: This program just displays Hello World 
set message=Hello World 
echo %message%

Đoạn code này sẽ in ra Hello World

Empty String

Để kiểm tra 1 string empty hay không, chúng ta dùng [%a%]==[]

@echo off 
SET a= 
SET b=Hello 
if [%a%]==[] echo "String A is empty" 
if [%b%]==[] echo "String B is empty "

Đoạn trên sẽ in ra String A is empty

Nối string

@echo off 
SET a=Hello 
SET b=World 
SET /A d=50 
SET c=%a% and %b% %d%
echo %c%

Kết quả là Hello and World 50

Độ dài string

Hihi, đáng tiếc là cũng không có hàm tính độ dài string, thế nên là làm thủ công thôi

@echo off
set str=Hello World
call :strLen str strlen
echo String is %strlen% characters long
exit /b

:strLen
setlocal enabledelayedexpansion

:strLen_Loop
   if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof 

Kết quả là 11 nhé

Ép kiểu toInt

@echo off
set var=13145
set /A var=%var% + 5
echo %var%

Kết quả là 13150

Left String

@echo off 
set str=Helloworld 
echo %str% 

set str=%str:~0,5% 
echo %str%

Kết quả của ví dụ trên là

Helloworld
Hello

Tức là chúng ta sẽ lấy 5 ký tự tiếp theo bắt đầu từ ký tự đầu tiên (vị trí thứ 0)

Right string

@echo off 
set str=This message needs changed. 
echo %str% 

set str=%str:~-8% 
echo %str%

Tương tự left string, đoạn ví dụ right string trên sẽ lấy 8 ký tự tính từ vị trí cuối cùng bên phải sang trái.

This message needs changed. 
changed.

remove

@echo off 
set str=Batch scripts is easy. It is really easy. 
echo %str% 

set str=%str:is=% 
echo %str%

Kết quả là

Batch scripts is easy. It is really easy. 
Batch scripts easy. It really easy.

Tức là từ is sẽ bị loại bỏ khỏi string bằng lệnh :is

Remove đầu và cuối string

@echo off 
set str=Batch scripts is easy. It is really easy 
echo %str% 

set str=%str:~1,-1% 
echo %str%

Đoạn script trên sẽ loại bỏ ký tự đầu tiên và ký tự cuối cùng của string, kết quả là

Batch scripts is easy. It is really easy 
atch scripts is easy. It is really eas

Xóa tất cả space

@echo off 
set str=This string    has    a  lot  of spaces 
echo %str% 

set str=%str:=% 
echo %str%

Kết quả là Thisstringhasalotofspaces

Repalce một string

@echo off 
set str=This message needs changed. 
echo %str% 

set str=%str:needs=has% 
echo %str%

Kết quả là

This message needs changed. 
This message has changed.

Các phép tính toán

Toán tử số học

+ - * / % giống các ngôn ngữ khác, lần lượt ta có các phép cộng, trừ, nhân, chia, và chia lấy phần dư.

Toán tử quan hệ

  • EQU So sánh bằng nhau, 2 obj bằng nhau trả về true.
  • NEQ so sánh khác nhau, 2 obj khác nhau trả về true.
  • LSS so sánh kém, ví dụ 2 LSS 3 trả về true.
  • LEQ so sánh kém hoặc bằng.
  • GTR so sánh hơn, ví dụ 3 GTR 2 trả về true.
  • GEQ so sánh hơn hoặc bằng. Ví dụ:
@echo off 
SET /A a=5 
SET /A b=10 
if %a% EQU %b% echo A is equal to than B 
if %a% NEQ %b% echo A is not equal to than B 
if %a% LSS %b% echo A is less than B 
if %a% LEQ %b% echo A is less than or equal B
if %a% GTR %b% echo A is greater than B 
if %a% GEQ %b% echo A is greater than or equal to B

Kết quả là:

A is not equal to than B
A is less than B
A is less than or equal B

Toán tử logic

Có các phép toán and, or và not tương tự các ngôn ngữ khác.

Phép gán

  • += cộng toán hạng bên phải vào toán hạng bên trái và gán giá trị nhận được vào toán hạng bên trái.
  • -= trừ toán hạng bên trái cho toán hạng bên phải và gán giá trị nhận được vào toán hạng bên trái.
  • *= tương tự với phép nhân
  • /= tương tự với phép chia
  • %= tương tự với phép chia lấy phần dư Ví dụ:
@echo off
SET /A a=5
SET /A a+=5
echo %a%
SET /A a-=5
echo %a%
SET /A a*=5
echo %a%
SET /A a/=5
echo %a%
SET /A a%=5
echo %a%

Kết quả là

10
5
25
5
5

Toán tử Bitwise

  • &: toán tử `and
  • |: toán tử or
  • ^: toán tử xor Ví dụ:
@echo off
SET /A "Result=48 & 23"
echo %Result%
SET /A "Result=16 | 16"
echo %Result%
SET /A "Result=31 ^ 15"
echo %Result%

Kết quả là:

16
16
16

Cấu trúc rẽ nhánh

if

if(condition) do_something

Nếu condition đúng thì sẽ thực hiện do_something, nếu ngược lại thì thực hiện câu lệnh tiếp theo, bỏ qua do_something

@echo off 
SET /A a=5 
SET /A b=10 
SET /A c=%a% + %b% 
if %c%==15 echo "The value of variable c is 15" 
if %c%==10 echo "The value of variable c is 10"

Kết quả là 15

if else

If (condition) (do_something) ELSE (do_something_else)

Nếu condition đúng thì thực hiện do_something, ngược lại nếu sai thì thực hiện do_something_else sau đó thực hiện các câu lệnh tiếp theo.

@echo off 
SET /A a=5 
SET /A b=10
SET /A c=%a% + %b% 
if %c%==15 (echo "The value of variable c is 15") else (echo "Unknown value") 
if %c%==10 (echo "The value of variable c is 10") else (echo "Unknown value")

Kết quả trả về là

"The value of variable c is 15" 
"Unknown value"

If lồng nhau

if(condition1) if (condition2) do_something

Nếu condition1 và condition2 đều đúng thì sẽ thực hiện do_something, nếu không sẽ bỏ qua

@echo off
SET /A a=5
SET /A b=10
if %a%==5 if %b%==10 echo "The value of the variables are correct"

Kết quả là

"The value of the variables are correct"

If errorlevel

if errorlevel n somecommand

trước câu lệnh trên là 1 câu lệnh khác, mà câu lệnh đó bị lỗi trả về 1 error code là interger n thì somecommand sẽ được thực hiện.

Goto

:label 
...some commands
if (condition) goto :label 
  • :label khai báo nhãn tên là label, nhãn này chứa các lệnh sẽ được thực thi khi gọi label.
  • Nếu condition đúng, các lệnh trong label sẽ được thực hiện ví dụ
@echo off 
SET /A a=5 
SET /A b=10 
if %a%==5 goto :labela 
if %b%==10 goto :labelb

:labela 
echo "The value of a is 5" 

:labelb 
echo "The value of a is 10"

Kết quả là

"The value of a is 5" 
"The value of a is 10"

Input / Output

  • stdin: Standard In - chứa input của program/script.
  • stdout: Standard Out - thường là output của program/script được in trên màn hình.
  • stderr: Standard Err - thường là thông điệp của lỗi được in trên màn hình.

Chuyển hướng đầu ra

Toán tử > sẽ chuyển hướng/gửi kết quả (stdout/stderr) của lệnh ra file.

Dir C: > list.txt

stdout của lệnh Dir C: được ghi trong file list.txt.

Dir C: 2> list.txt

Nếu thêm 2 vào câu lệnh trên, thì nếu Dir C: trả ra lỗi thì thông điệp về lỗi này sẽ được lưu ở file list.txt, thử ví dụ bằng câu lệnh Dir Z: với Z là tên ổ đĩa mà máy tính của bạn không có, file list.txt sẽ có dòng chữ The system cannot find the path specified.

Ngắt kết quả chương trình

Dir C: > NUL

Ném kết quả lệnh Dir C: vào hư vô, không được xuất hiện ra màn hình hay file nào cả.

stdin

TYPE CON > lists.txt

Sau câu lệnh trên thì tất cả những gì bạn gõ trên cmd đều được lưu vào trong file lists.txt

Vòng lặp

while

Không có vòng while trong thứ này, đúng là như thế đó. Thay vào đó, chúng ta tự viết 1 ra 1 thứ tương tự nó, dùng if và label

Set counters
:label
If (expression) (
   Do_something
   Increment counter
   Go back to :label
)

Ví dụ:

@echo off
SET /A "index=1"
SET /A "count=5"
:while
if %index% leq %count% (
   echo The value of index is %index%
   SET /A "index=index + 1"
   goto :while
)

Kết quả

The value of index is 1
The value of index is 2
The value of index is 3
The value of index is 4
The value of index is 5

for

Ví dụ

@echo off 
FOR %%F IN (1 2 3 4 5) DO echo %%F

Kết quả

1 
2 
3 
4 
5

Classic for

Tại sao lại là classic for, bởi vì vòng for vừa giới thiệu là vòng lặp trong 1 list, trong khi vòng for chúng ta vẫn hay cần dùng lại là như thế này:

for(variable declaration;expression;Increment) {
   statement #1
   statement #2
   …
}

Giờ làm sao? lại phải tự viết thôi. Ví dụ:

@echo off 
SET /A i=1 
:loop 

IF %i%==5 GOTO END 
echo The value of i is %i% 
SET /a i=%i%+1 
GOTO :LOOP 
:END 

Kết quả là

The value of i is 1 
The value of i is 2 
The value of i is 3 
The value of i is 4

Vòng lặp trong 1 khoảng

FOR /L %%variable IN (lowerlimit,Increment,Upperlimit) DO do_something

Ví dụ:

@ECHO OFF 
FOR /L %%X IN (0,1,5) DO ECHO %%X

Kết quả:

0 
1 
2 
3 
4 
5

Ở đây vòng lặp sẽ chạy từ 0 tới 5, với bước nhảy là 1.

Break vòng lặp

Hehe, lại đáng tiếc lần nữa là không có lệnh break, chúng ta lại phải tự làm lấy 1 cái bằng if và label. Ví dụ

@echo off 
SET /A "index=1" 
SET /A "count=5" 
:while 
if %index% leq %count% ( 
   if %index%==2 goto :Increment 
      echo The value of index is %index% 
:Increment 
   SET /A "index=index + 1" 
   goto :while 
)

Ở đây chúng ta có 1 vòng lặp while giả mà được nói ở trên             </div>
            
            <div class=

0