Batch (ngôn ngữ lập trình)

**Batch** là một ngôn ngữ lập trình được dựa trên các tập tin thực thi batch (*.bat, *.cmd,...) để chạy. Chúng sẽ được thực thi dưới dạng một cửa sổ **Command Prompt** để chạy những dòng lệnh. Batch cũng có thể rất nguy hiểm nếu sử dụng không đúng cách (xoá toàn bộ ổ cứng, làm tắt internet vĩnh viễn,...) thậm chí còn có thể làm hư cả hệ điều hành. Batch có thể được viết bằng các phần mềm chỉnh sửa văn bản đơn giản như Notepad, Sublime Text, v.v...

## Lịch sử
Batch được giới thiệu cùng với hệ điều hành MS-DOS, với khả năng thực hiện nhiều câu lệnh hàng loạt thay vì chạy từng câu lệnh như trước đây.

Batch cho đến nay vẫn còn được sử dụng trên các hệ điều hành Mircosoft Windows, với nhiều cải tiến như khả năng thực hiện các phép tính, đọc dữ liệu từ bàn phím hay thay đổi màu sắc trên cửa sổ Command Prompt.

## Cú pháp
Do một chương trình Batch là tập hợp các câu lệnh, nên cú pháp của nó rất đơn giản:
```batch
câu_lệnh_1 (các đối số)
```
Trong Batch có một số câu lệnh đặc biệt, thường hay được sử dụng trong nhiều chương trình:
```bat
echo <on/off>                Bật/tắt hiện thị câu lệnh
echo.<...>                   In ra màn hình
set <keyword>                Tìm các biến bắt đầu bằng <keyword>
set <varname>=<value>        Thay đổi giá trị của biến <varname>
set /p <varname>=<prompt>    In ra màn hình <prompt> rồi đọc từ bàn phím
set /a <varname>=...         Thực hiện phép tính. VD: `set /a total=%a% + 12`
call <programname>           Gọi chương trình khác
call:<label>                Gọi chương trình con
goto <label>                 Nhảy tới vị trí:<label>
```


## Ví dụ
Muốn viết được chương trình Hello World, ta có thể sử dụng ví dụ đơn giản dưới đây:
```batch
@echo off
cls
title Hello World
cls
color 02 
cls
echo Hello world!
```
Trong đó:
```batch
@echo off
```
@: Làm cho câu lệnh không hiển thị ra màn hình (VD: "C:\> echo off" sẽ được ẩn đi trong dòng lệnh này)

echo off: Chuyển chế độ sang ẩn câu lệnh (tức là dấu "@" sẽ được thêm vào trước các câu lệnh)


```batch
cls
```
Là câu lệnh xoá màn hình.


```batch
title Hello World
```
Là câu lệnh dùng để hiển thị tên của cửa sổ Command Prompt. Trong trường hợp này, cửa sổ có tên là Hello World


```batch
color 02
```
Là câu lệnh đổi màu chữ để tăng vẻ đẹp cho chương trình. Chữ thứ nhất chỉ định cho màu nền (0), chữ thứ hai chỉ định cho màu chữ (2). Chúng ta có thể thay thế số 2 bằng các màu khác:

+ 0 là đen (màu ngầm định của nền)

+ 1 là màu xanh dương

+ 2 là màu xanh lá cây

+ 3 là màu xanh mòng biển

+ 4 là màu đỏ

+ 5 là màu tím hồng

+ 6 là màu vàng

+ 7 là màu trắng (màu ngầm định của chữ)

+ 8 là màu xám

+ 9 là màu xanh dương sáng

+ A là màu xanh lá cây sáng

+ B là màu xanh mòng biển sáng

+ C là màu đỏ sáng

+ D là màu hồng sáng

+ E là màu vàng sáng

+ F là màu trắng sáng
```batch
echo Hello world
```
**echo** là câu lệnh viết lên màn hình. Trong ví dụ này ta viết lên màn hình dòng chữ Hello world.

Tuy nhiên, **echo off** và **echo on** thì không thể viết lên màn hình được.

Có thể sử dụng **echo.** để xuống dòng.

## Đặt biến và nhập dữ liệu
Trong mọi ngôn ngữ lập trình, biến là không thể thiếu, Batch cũng không ngoại lệ. Cách để khai báo biến:
```batch
set <tên biến> = a
set /a <tên biến> = b
```
Trong đó:

a là giá trị của biến là số hoặc chuỗi.

b là giá trị của biến là số.

Ví dụ:
```batch
@echo off
color 0
set notnumber = Hello
set /a number = 10
echo %notnumber%
echo This is %number%
pause
exit
```


### Sử dụng biến để tính toán
Bạn có thể sử dụng biến để tính các phép tính đơn giản. Tuy nhiên, điểm hạn chế là nó không hỗ trợ số thập phân.

Ví dụ:
```batch
rem Tính tổng 10 + 5
set /a total=10 + 5

rem Lấy phần dư của số (kết quả ra 1)
set /a mod=10 %% 3
rem Lưu ý: Trong Command Prompt, bạn phải sử dụng 1 dấu '%'

rem Dấu ngoặc cũng có thể sử dụng
set /a total=5 * (10 + 2)
```


### Sử dụng biến để cắt và thay thế chữ
Việc thay thế chữ (hoặc cắt chữ) cũng rất quan trọng.:
```batch
rem Cách sử dụng (cắt chữ):
rem %tênbiến:~vịtríbắtđầu,sốkýtựcầncắt%
rem VD: Cắt lấy 5 chữ cái cách chữ cái đầu 1 ký tự của biến:
set data=Hello World
set data=%data:~1,5%
rem "ello "

rem Cách sử dụng (thay thế):
rem %tênbiến:chữcầnthaythế:chữthaythế%
rem VD: Thay thế chữ Hello sang chữ World:
set data=Hello World
set data=%data:Hello=World%
rem "World World"
```
Điều đặc biệt là bạn có thể làm như vậy với biến số.

### Đọc biến nhập từ bàn phím
Nếu bạn có dự định làm một phần mềm viết bằng Batch, thì bạn cũng có thể đọc dữ liệu từ bàn phím
```batch
rem Đọc dữ liệu từ bàn phím:
rem set /p tênbiến="Các dòng chữ sẽ hiển thị ở đây:"
set /p password="Type password: "
rem "Type password: <dữ liệu từ bàn phím>"
```
Tuy nhiên, việc đọc từ mật khẩu từ bàn phím không phải là lựa chọn tốt nhất để làm một chương trình khóa các tệp.

### Một số từ khóa trong Batch
ver: Trả về phiên bản MS-DOS đang sử dụng

cd: Chuyển hướng thư mục đang làm việc

cls: Xóa màn hình MS-DOS

copy: Sao chép file

del: Xóa file

dir: Hiển thị nội dùng của một thư mục

echo: Hiển thị văn bản trên màn hình MS-DOS

exit: Thoát chương trình

md: Tạo một thư mục mởi vị trí hiện tại đang làm việc

pause: Ngăn không cho chương trình thoát và đợi cho tới khi bất kì phím nào trên bàn phím đucợ nhấn

## Gọi tên một chương trình Batch khác
Nếu bạn có nhiều chương trình batch trong 1 thư mục, thì bạn cũng có thể gọi cái chương trình ấy ra mà không làm cho chương trình của bạn bị thoát.

Sử dụng bằng lệnh "call  "

Nó còn có thể gọi được tất cả các lệnh của batch nữa. (call echo Hello World)