openplanning

Vòng lặp trong ngôn ngữ kịch bản Batch

  1. Tổng quan về vòng lặp trong ngôn ngữ Batch
  2. Vòng lặp for (Mặc định)
  3. For /R
  4. For /D
  5. For /L
  6. For /F

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ọn
Mô tả
delims=xxx
Các ký tự phân cách (delimiter character(s)). Mặc đinh là một khoảng trắng (space)
skip=n
Số 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
Tokens
Mô tả
tokens=1,2,4
Các chỉ số 1, 2, 4 được quan tâm.
tokens=2-8
Cá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).
Ví dụ phân tích chuỗi:
  • TODO