Thứ Ba, 31 tháng 5, 2022

Mảng trong Batch

 Mảng là một dẫy các phần tử liền kề nhau, các phần tử được đánh chỉ số (index)  0, 1, 2, ....

Với các ngôn ngữ khác mảng có kích thước cố định. Nhưng trong ngôn ngữ Batch, mảng có kích thước động, và không có thuộc tính mô tả độ dài của mảng (số phần tử của mảng). Và cũng không có hàm (function) nào trực tiếp giúp bạn lấy được số phần tử của một mảng.
Tất cả các phần tử của mảng cần phải được gán giá trị thông qua lệnh set, nếu không phần tử đó không tồn tại.

@echo off
set myarray[0] = Abc
set /A myarray[1] = 234
set myarray[2]=Def

set myarray[0]=A new value
Ví dụ:
arrayExample1.bat

@echo off
set names[0]=Tom
set names[1]=Jerry
set names[2]=Donald
set names[3]=Aladin

echo names[0]= %names[0]%
echo names[3]= %names[3]%

@rem names[10] does not exists!
echo names[10]= %names[10]%
pause
Bạn có thể gán giá trị mới cho các phần tử của mảng, dưới đây là ví dụ:
arrayExample2.bat

@echo off
set names[0]=Tom
set names[1]=Jerry
echo names[0]= %names[0]%

@rem: Assign new value
set names[0]=Donald

echo After assign new value to names[0]:
echo names[0]= %names[0]%
pause

2- Kiểm tra sự tồn tại của một phần tử

Sử dụng lệnh defined giúp bạn có thể kiểm tra một phần tử trong mảng có tồn tại hay không?
arrayDefinedExample.bat

@echo off
set Arr[0]=1000
set Arr[1]=5000
set Arr[2]=3000

if not defined Arr[5] (
   echo Element at 5 does not exists!
)
if defined Arr[1] (
   echo Element at 1 exists!
)
pause

3- Lặp trên các phần tử của mảng

Vòng lặp For /F có thể duyệt trên một dải số (Range of numbers), vì vậy nó có thể duyệt trên dải các chỉ số của mảng (range of indexes)
fetchArrayExample1.bat

@echo off
set fruits[0]=Apple
set fruits[1]=Apricot
set fruits[2]=Asparagus
set fruits[3]=Aubergine
set fruits[4]=Banana

FOR /L %%i IN (0 1 4) DO  (
   call echo Element At %%i = %%fruits[%%i]%%
)
pause
Nếu bạn không biết trước số phần tử của mảng, bạn có thể lặp trên các phần tử của nó bằng cách sử dụng lệnh goto.
fetchArrayExample2.bat

@echo off
set fruits[0]=Apple
set fruits[1]=Apricot
set fruits[2]=Asparagus
set fruits[3]=Aubergine
set fruits[4]=Banana

set /A i = 0
:my_loop 
    if defined fruits[%i%]  (
        call echo Element At %i% = %%fruits[%i%]%%  
        set /a i = %i% + 1
        goto :my_loop
    ) 
echo Done!
pause

4- Phần tử có cấu trúc

Trong ngôn ngữ Batch, phần tử của mảng có thể có một cấu trúc (Structure). Một cấu trúc là một đối tượng có nhiều thuộc tính, chẳng hạn một đối tượng dại diện cho một người với 2 thuộc tính firstNamelastName (Tên, Họ).
structureArrayExample.bat

@echo off
set persons[0].firstName=Bill
set persons[0].lastName=Gates

set persons[1].firstName=Steve
set persons[1].lastName=Jobs

set persons[2].firstName=Mark
set persons[2].lastName=Zuckerberg 

set persons[3].firstName=Sundar
set persons[3].lastName=Pichai

FOR /L %%i IN (0 1 3) DO  (
   call echo Person At %%i = %%persons[%%i].firstName%% %%persons[%%i].lastName%%
)
pause

Nguồn:
openplanning.net

Vòng lặp trong Batch

 

1- Tổng quan về vòng lặp trong ngôn ngữ Batch

Các dấu ngăn cách chuẩn (Standard Delimiter).
  • Dấu cách (space)
  • Dấu phẩy ( , )
  • Dấu chấm phẩy ( ; )
  • Dấu TAB

2- Vòng lặp for (Mặc định)

Vòng lặp For (mặc định) của ngôn ngữ Batch được sử dụng để lặp trên một danh sách các file.
Cú pháp:

@rem set_of_files -  Một danh sách các file.
@rem Các file ngăn cách bởi các dấu phân cách chuẩn (standard delimiter)
@rem Tên tham số 'variable' phải là 1 ký tự
FOR %%variable IN ( set_of_files ) DO command

@rem Hoặc:
FOR %%parameter IN ( set_of_files ) DO  (
     command
)
Ví dụ copy một vài file vào một thư mục (Chú ý các file cần copy và thư mục đích cần phải cùng một ổ đĩa).
copyFiles.bat

@echo off
@rem Copy to same Disk

FOR %%f IN (E:\test\file1.data  E:\test\file2.txt) DO  (
   echo Copying %%f
   copy  %%f E:\backup
)pause

Ví dụ khác:

@rem Sử dụng dấu phân cách ( ; )
FOR %%f IN ("E:\my dir\file1.data" ; E:\test\file2.txt) DO copy %%f E:\backup

@rem Sử dụng dấu phân cách ( , )
FOR %%f IN ("E:\my dir\file1.data" , E:\test\file2.txt) DO copy %%f E:\backup

@rem Sử dụng dấu phân cách khoảng trắng
FOR %%f IN ("E:\my dir\file1.data" E:\test\file2.txt) DO copy %%f E:\backup

3- For /R

Vòng lặp FOR /R được sử dụng để lặp trên danh sách các tập tin. Bao gồm cả các tập tin trong các thư mục con, cháu,.. Nó được gọi là vòng lặp đệ quy (Recurse).
Cú pháp:

FOR /R [path] %%variable IN ( set_of_file_filters ) DO command

@rem Hoặc:
FOR /R [path] %%variable IN ( set_of_file_filters ) DO (
   command
)
  • [path] : Tham số này là thư mục gốc. Nếu không có tham số này "thư mục chứa tập tin kịch bản đang thực thi" hoặc "thư mục hiện tại" sẽ được coi là thư mục gốc.
  • set_of_file_filters : Danh sách các bộ lọc file. Ví dụ *.txt , *.bat, ... Hoặc dấu chấm ( . ) nghĩa là tất cả.
  • variable: Là tên biến và phải có 1 ký tự duy nhất.
Ví dụ dưới đây in ra danh sách tất cả các tập tin *.txt hoặc *.log trong thư mục C:/Windows/System32 (Tìm trong cả các thư mục con, cháu,..)
forR_example1.bat

@echo off
FOR /R "C:\Windows\System32" %%f IN (*.txt *.log) DO  (
   echo %%f
)
pause


Ví dụ liệt kê tất cả các tập tin trong thư mục C:/Windows/System32 (Bao gồm các tập tin trong các thư mục con, cháu,...)
forR_example2.bat

@echo off 
FOR /R "C:\Windows\System32" %%f IN ( . ) DO  ( 
   echo %%f
)
pause

4- For /D

Vòng lặp FOR /D được sử dụng để duyệt trên danh sách các thư mục là thư mục con của thư mục hiện tại. 
Cú pháp:

FOR /D [/r] %%variable IN ( set_of_directory_filters ) DO command

@rem Hoặc:
FOR /D [/r] %%parameter IN ( set_of_directory_filters ) DO  (
    command
)
  • set_of_directory_filters : Danh sách các bộ lọc thư mục (directory filter) chẳng hạn en*, fr*,..  ngăn cách nhau bởi dấu phân cách chuẩn (Standard Delimiter).
  • [/r]: Đây là tham số đệ quy (Recurse) và không bắt buộc, nếu có tham số này các thư mục con, cháu,.. sẽ được tham gia vào vòng lặp.
  • variable: Là tên biến và phải có 1 ký tự duy nhất.
Ví dụ: Liệt kê danh sách các thư mục con của thư mục C:/Windows.
forD_example1.bat

@echo off
C:
cd C:/Windows

FOR /D %%d IN ( * ) DO  (
   echo %%d
)
pause
Ví dụ: Liệt kê các thư mục con, cháu của thư mục C:/Windows có tên bắt đầu bởi "en" hoặc "fr"
forD_example2.bat

@echo off
C:
cd C:/Windows

FOR /D /r %%d IN (en* fr*) DO  (
   echo %%d
)
pause



5- For /L

Vòng lặp For /L được sử dụng để duyệt trên một dải các số (range of numbers).
Cú pháp:

FOR /L %%variable IN (start, step, end) DO command

@rem Hoặc:
FOR /L %%variable IN (start, step, end) DO  (
     command
)
  • start: Giá trị đầu tiên của biến
  • step: Sau mỗi bước lặp (iteration) giá trị của biến sẽ được cộng thêm 'step'.
  • end: Giá trị cuối cùng.
Ví dụ:
forL_example1.bat

@echo off 
FOR /L %%d IN (1 2 8 ) DO  (
   echo %%d
)
pause


forL_example2.bat

@echo off 
FOR /L %%d IN (20 -2 5 ) DO  (
   echo %%d
)
pause

6- For /F

Vòng lặp For /F là một vòng lặp phức tạp nhưng đầy sức mạnh. Nó đọc nội dung một tập tin hoặc một vài tập tin. Sau đó phân tích nội dung của các tập tin. Nội dung của một tập tin là một văn bản, nó sẽ được phân tách thành nhiều đoạn văn bản nhỏ, mỗi đoạn văn bản nhỏ được gọi là một Token. Quy tắc mặc định để phân tách văn bản dựa trên các khoảng trắng (white space). Tuy nhiên bạn có thể tùy biến quy tắc phân tách bởi tham số ["delims=xxx"].
Vòng lặp For /F cũng được sử dụng để phân tích nội dung của một chuỗi (string), hoặc để thực thi một tập hợp lệnh.

Cú pháp:

FOR /F ["options"] %%variable IN ( set_of_filenames ) DO command

FOR /F ["options"] %%variable IN ( set_of_filenames ) DO (
     command
)
FOR /F ["options"] %%variable IN ("Text string to process") DO command
FOR /F ["options"] %%variable IN ("Text string to process") DO ( 
     command
)
  • set_of_filenames: Danh sách một hoặc nhiều tập tin.
  • options: Các tùy chọn, ví dụ: "delims=, tokens=1,2,4"
Tùy chọnMô tả
delims=xxxCác ký tự phân cách (delimiter character(s)). Mặc đinh là một khoảng trắng (space)
skip=nSố dòng đầu tiên sẽ được bỏ qua trong nội dung của tập tin. Mặc định skip=0
eol=;eol (End of Line): Chỉ định một ký tự đặc biệt, nó được đặt ở đầu một dòng để đánh dấu dòng này là dòng chú thích. Dòng chú thích sẽ bị chương trình bỏ qua. Mặc định là ký tự chấm phẩy ( ; )
tokens=n1,n2,n3Định nghĩa các vị trí được quan tâm (n1, n2, n3, ..), Mặc định tokens=1
usebackq(Xem thêm giải thích trong các ví dụ)
Để dễ hiểu chúng ta hãy phân tích tập tin sau:

eol (End of Line)
eol: Sử dụng để chỉ định một ký tự đặc biệt. Mặc định là ký tự chấm phẩy ( ; ). Nó được đặt tại đầu của một dòng để đánh dấu dòng đó là một chú thích (comment), chương trình sẽ bỏ qua dòng này.
skip=n
skip: Khai báo số dòng đầu tiên của tập tin sẽ bị bỏ qua, chương trình sẽ không phân tích các dòng này. Mặc định skip=0
delims (Delimiter character(s))
delims: Định nghĩa các ký tự ngăn cách (delimiter characters), giúp chương trình phân tách từng dòng văn bản thành các đoạn văn bản con, mỗi đoạn văn bản con được gọi là một Token. Các Token được đánh chỉ số 1, 2, 3, ...
tokens=n1,n2,n3
tokens: Khai báo danh sách các chỉ số được quan tâm, các chỉ số ngăn cách nhau bởi dấu phẩy. Chẳng hạn tokens=1,2,4. Mặc định: tokens=1
TokensMô tả
tokens=1,2,4Các chỉ số 1, 2, 4 được quan tâm.
tokens=2-8Các chỉ số từ 2 đến 8 được quan tâm
tokens=3,*Các chỉ số 3, 4,5, ... được quan tâm
tokens=*Tất cả các chỉ số được quan tâm
Ví dụ "tokens=1,2,4", có nghĩa là chỉ các Token tại vị trí 1, 2, 4 được quan tâm, các Token khác sẽ bị bỏ qua (Ignore).
Ví dụ phân tích tập tin:
Ví dụ sử dụng vòng lặp FOR /F để đọc tập tin persons.txt:
persons.txt

List of celebrities
Creation date: 2017/09/11

; (Comment) Male List
Bill,Gates,1955/10/28,Male
Steve,Jobs,1955/02/24,Male
Mark,Zuckerberg,1984/05/16,Male
Sundar,Pichai,1972/07/12,Male
; (Comment) Female List
Hillary,Clinton,1947/10/26,Female
forF_example1.bat

@echo off 
FOR /F "delims=, skip=3 eol=; tokens=1,2,4" %%i IN ( persons.txt ) DO  (
   echo Full Name: %%i %%j   Gender: %%k
)
pause
 
Chú ý: Tên các biến trên vòng lặp chỉ có duy nhất một ký tự.
Biến %%i được khai báo tường minh trên vòng lặp. Các biến %%j%%k là các biến được khai báo không tường minh (Tên của các biến không tường minh là các ký tự kế tiếp của tên biến tường minh).

Nguồn:
openplanning.net









Ngôn ngữ kịch bản Batch

 

1- Ngôn ngữ batch là gì?

Batch là một ngôn ngữ lập trình, nó được sử dụng để tạo ra các tập tin kịch bản có thể thực thi trên hệ điều hành Windows, thông thường các tập tin này có đuôi *.bat hoặc *.cmd. Khi được thực thi chúng mở ra một cửa sổ "Command Prompt", thông thường cửa sổ này có nền đen, chữ trắng đặc trưng.
Các tập tin batch (*.bat*.cmd) được gọi là các tập tin kịch bản (script file), chúng có thể chứa các lệnh can thiệp vào hệ điều hành.


Batch sử dụng @rem để bắt đầu một dòng chú thích (Comment), Dòng chú thích được sử dụng để ghi chú lại mục đích của các dòng lệnh trong chương trình, và chúng được bỏ qua khi chương trình thực thi.
Để bắt đầu ngôn ngữ Batch, chúng ta tạo một tập tin có tên hello.bat, và viết các lệnh in ra màn hình dòng chữ "Three""Two""One""Hello World!".

Nhấn kép chuột vào hello.bat để thực thi (execute) tập tin này.

echoIn ra màn hình một dòng chữ
pauseTạm ngừng chương trình, và chờ đợi người dùng nhấn Enter để tiếp tục.

@echo on/off
Lệnh @echo off sử dụng để tắt chế độ hiển thị command prompt (lời nhắc). Chế độ này được bật (on) bởi mặc định. Chúng ta hãy xem sự khác biệt giữa @echo off và @echo on theo hình minh họa dưới đây:




Nguồn:
openplanning.net



Code by : Truongcom