CMD
là phần mềm giao diện lệnh sử dụng cho hệ điều hành Window, một tiện
ích của Microsoft, mọi hệ điều hành đằng sau giao diện người dùng là sử
lý bởi command line. Bài này mình sẽ trình bầy sơ qua các kiến thức cơ
bản về lập trình và cách sử dụng tập lệnh trong cmd. Căn cứ vào đó bạn
có cái nhìn tổng quan.
Chú giải – comment
::chu giai
REM chu giai
Dừng màn hình – pause screen
Một số trương trình BAT thoát cửa sổ sau khi thực thi hoàn tất, bạn có
thể cho dừng màn hình để theo dõi hoặc sử dụng thêm, bằng cách chèn thêm
lệnh:
pause //có dòng "Press any key to continue . . ."
pause >nul //ko có dòng "Press any key to continue . . ."
– Thoát cmd exit
In chuỗi
//in chuỗi
@echo hello world!
Mặc định các lệnh command line bạn viết trong file .bat sẽ hiện thị
ra console, nhưng nếu muốn không cho show từng lệnh ra và chỉ hiển thị
kết quả thì thêm dòng này vào đầu file.
//tắt echo
@echo off
Ngày tháng
In ngày hiện tại.
//in ngày
@echo |DATE
Kết quả, ví dụ:
The current date is: 11/11/2014
In thời gian hiện tại.
//print time
@echo |TIME
Result:
The current time is: 10:34:57,27
Mở file/FILE
Sử dụng lệnh start
nếu bạn muốn mở file có trong máy tính thông qua cmd. VD:
//mở 1 file
start 1.txt
start c:/1.txt
Hoặc mở địa chỉ trang web trên trình duyệt
//mở 1 trang web
start http://www.hoangweb.com
Tạo biến
Khai báo biến.
//khai báo biến
set FLEX_SDK=D:\FLASH\setups\flex_sdk_4.6_2
để sử dụng biến, bạn đặt tên biến bởi cặp ký tự % như thế này: %FLEX_SDK%
và in giá trị biến ra console.
@echo %FLEX_SDK%
Cách biến đặc biệt
– Thư mục C:/Users/Admin
%USERPROFILE%
– Trả về tên account user hiện tại.
%USERNAME%
Mảng
– Gọi lệnh cmd khác, lấy kết quả là nảng đưa vào biến. Chú ý: sử dụng ngoặc đơn: ‘ không dùng ngoặc kép ” sẽ sai. VD:
set files=('dir /b c\*.class')
Liệt kê mảng sử dụng vòng lặp for do.
@echo off
for /f %%f in ('dir /b *.jpg') do (
echo %%f
)
Ví dụ trên liệt kê tất cả các file .jpg ở thư mục chứa script này, nếu có.
Bạn có thể gán mảng vào biến, như ví dụ ở trên chúng ta thay thế với biến files
.
for /f %%f in %files% do (
echo %%f
)
Lưu ý: Để ý tạo biến mới trong lệnh for không dùng ‘set’ thay vào đó
bạn viết 2 ký tự %% đằng trước tên biến và cách truy cập biến cũng giống
như vậy. Không được dùng cách lấy biến thông thường: %f%
Tạo mảng mới.
set arrayline[0]=############
set arrayline[1]=#..........#
set arrayline[2]=#..........#
set arrayline[3]=#..........#
set arrayline[4]=#..........#
set arrayline[5]=#..........#
set arrayline[6]=#..........#
set arrayline[7]=#..........#
set arrayline[8]=#..........#
set arrayline[9]=#..........#
set arrayline[10]=#..........#
set arrayline[11]=#..........#
set arrayline[12]=############
Duyệt các phần tử có trong mảng với lệnh for-do.
for %%x in %arrayline% do (
//gía trị pần tử
%%x
//sai
%x%
)
Ví dụ:
@echo off
setlocal enabledelayedexpansion
set arrayline[0]=############
set arrayline[1]=#..........#
set arrayline[10]=#..........#
set arrayline[11]=#..........#
set arrayline[12]=############
::read it using a FOR /L statement
for %%x in %arrayline% do (
//gía trị pần tử
%%x
//sai
%x%
)
pause
Khai báo thư viện – thiết lập biến môi trường bằng lệnh
Xem hướng dẫn thêm thư viện command line vào môi trường CMD của windows
thông qua Control Panel, ngoài ra bạn còn có thể khai báo thêm đường
dẫn tới file chạy executable sử dụng trong công cụ command line CMD bằng
cách cài đặt lệnh setx
.
Ví dụ dưới đây mình khai báo đường dẫn java sdk vào biến môi trường JAVA_HOME.
//Simple example how to set JAVA_HOME with setx.exe in command line
setx JAVA_HOME "C:\Program Files (x86)\Java\jdk1.7.0_04"
Nếu các thư viện bạn muốn chía sẻ cho mọi tài khoản người dùng trong windows, với tham số “-m”.
//If you what so set variable for all users you have to use option "-m" here is example:
setx -m JAVA_HOME "C:\Program Files (x86)\Java\jdk1.7.0_04"
Gửi email
Sử dụng lệnh start bạn có thể mở trang gửi email của google hoặc mở
ngay ứng dụng Microsoft Outlook để gửi mail với nội dung bạn viết sẵn.
start mailto:quachhoang_205@yahoo.com
Bạn cũng có thể điền email người gửi, chủ đề và nội dung gửi đi bởi tham số truyền vào cú pháp ‘mailto’, ví dụ:
@echo off
:Mail
FOR /F "TOKENS=2*" %%A IN ('DATE/T') DO SET DATE=%%A
FOR /F %%A IN ('TIME/T') DO SET TIME=%%A
START mailto:laptrinhweb123@gmail.com?subject=Thiet%%20ke%%20web%%20Hoangweb.com^&body=At%%20%DATE%,%%20%TIME%,%%20user%%20%USERNAME%%%20encountered%%20the%%20following%%20drive%%20mapping%%20error(s)%%20on%%20%COMPUTERNAME%:%%0D%%0A%BODY%
GOTO :EOF
Kết quả máy tính của mình đã mở Outlook express sau đó với nội dung
chỉ định sẵn, người dùng chỉ việc nhấn nút send để gửi đến email người
nhận:
Sử lý chuỗi
Tìm và thay thế chuỗi. Ví dụ sau thay thế chuỗi ‘chair’ thành từ ‘table’ lưu bởi biến word
.
@echo off
setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair= !word!%
echo %str%
Cách khác:
set word=table
set str="jump over the chair"
call set str=%%str:chair=%word%%%
echo %str%
Bạn có thể sử dụng biến tìm chuỗi chứa mọi ký tự bao gồm dấu cách, thay nội dung chuỗi bằng tên biến vd: %var1%
.
@echo off
set find=chair 123
set word=table
set str="jump over the chair 123"
call set str=%%str:%find%=%word%%%
echo %str%
Câu lệnh
– Phát biểu điều kiện.
//điều kiện
if not true <command>
– Nhảy đến nhãn và chạy tiếp lệnh
//nhảy đến nhãn
goto nhan1
:nhan1
echo heelo !
Xuất nội dung ra file
@echo |DATE >hoang.txt
Thay vì in chuỗi ra console, kết quả của lệnh sẽ ghi vào file bạn chỉ định, ví dụ trên lưu thông tin ngày tháng vào file hoang.txt trong thư mục hiện tại cmd đang làm việc.
Ví dụ khác, mình xuất nội dung của bảng wp_users trong csdl mysql sử dụng XAMPP.
Trước tiên đảm bảo dịch vụ mysql đã bật bằng cách mở XAMPP Control Panel và nhấn vào start tại dòng module MySQL.
//ie: lấy nội dung table mysql vào file
c:/xampp/mysql/bin/mysql.exe -u root -Nrs -e"use test;SELECT * from wp_users;" >out.txt
Prompt
Hiển thị nhấu nhắc kèm thông báo nhập dữ liệu.
set /p var1="Insert your name?"
@echo %var1%
Lấy nội dung nhập từ người dùng và lưu vào biến ‘var1’. Cuối cùng in chuỗi này ra màn hình.
Hoặc viết như thế này cũng có tác dụng tương đương:
set /p "var1=Insert your name?"
Làm việc với file & folder
Xóa file: del file-name
Xóa folder.
//del folder
rmdir directoryname
rmdir /S directoryname #use /S to delete a non empty directory
rmdir /Q /S directoryname #delete without being asked for confirmation
rmdir /Q /S "folder 1" #You can specify the directory name in quotes.
Kiểm tra sự tồn tại của folder/file? chúng ta sử dụng cú pháp exist
. Ví dụ kiểm tra FLEX_SDK có cài đặt trong máy tính. Nếu lệnh sau trả về true nghĩa là trong máy tính của bạn có.
exist "%FLEX_SDK%\bin"
Sử dụng trong câu lệnh điều kiện.
if exist "2.jpg" (
@echo "exists 2.jpg"
)
if exist "c:\folder1" (
echo "found your folder."
)
Nếu bạn không nhớ tên file, có thể sử dụng ký tự wildcat.
::chỉ định nhiều file cùng một định dạng
if exist "*.jpg" (
@echo "found any images file like .jpg"
)
– Liệt kê tất cả các file có trong thư mục.
dir /b c:\*.class
Giải thích:
Tham số ‘/b’: trả về nguyên tên file & mở rộng (VD: 1.png), và bỏ qua các thông tin khác của file như ngày tạo, kích thước…
Ví dụ sau duyệt các file:
::list files sử dụng for, với tham số /f
for /f %%f in ('dir /b c:\*.class') do (
//truy cập phần tử
echo %%f
//lấy tên file không đuôi mở rộng (extension)
%%~nf
)
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à
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à
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à:
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"
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.
stdout của lệnh Dir C:\
được ghi trong file 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
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
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ả
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ả:
Ở đâ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 , chúng ta muốn break ở chỗ index = 2 thì dùng if như trên, nó sẽ goto luôn tới label increment và bỏ qua lệnh echo
.
Kết quả:
The value of index is 1
The value of index is 3
The value of index is 4
The value of index is 5
Function
Ở trên chúng ta đã dùng rất nhiều label
, cũng có thể gọi đó là function
. Trong batch script thì chúng ta tạo 1 function như thế này:
:function_name
Do_something
EXIT /B 0
Và khi gọi function thì dùng như thế này:
@echo off
SETLOCAL
CALL :Display
EXIT /B %ERRORLEVEL%
:Display
SET /A index=2
echo The value of index is %index%
EXIT /B 0
Kết quả là The value of index is 2
Return Code
Mặc định khi 1 command line sau khi được thực hiện thành công thì sẽ trả về 0, còn nếu khác 0 thì đương nhiên là bị lỗi rồi.
Code |
Giải thích |
0 |
Thành công |
1 |
Function không chính xác. Có thể không được nhận ra đúng function có trong batch |
2 |
Hệ thống không thể tìm thấy các tập tin được chỉ định. Chỉ ra rằng tệp không thể tìm thấy ở vị trí được chỉ định |
3 |
Hệ thống không thể tìm đường dẫn cụ thể. Chỉ ra rằng không thể tìm thấy đường dẫn được chỉ định. |
5 |
Truy cập bị từ chối. Cho biết người dùng không có quyền truy cập vào tài nguyên được chỉ định. |
9009 0x2331 |
Chỉ ra rằng lệnh, tên ứng dụng hoặc đường dẫn đã bị lỗi chính tả khi định cấu hình Action. |
221225495 0xC0000017 -1073741801 |
Không đủ bộ nhớ ảo. Nó chỉ ra rằng Windows đã hết bộ nhớ. |
3221225786 0xC000013A -1073741510 |
cmd bị ngắt bởi người dùng Ctrl C |
3221225794 0xC0000142 -1073741502 |
Ứng dụng không thể khởi tạo đúng cách. Có thể do user không có quyền truy cập, gdi32.dll hoặc user32.dll bị lỗi |
Kết luận
- Còn rất nhiều thứ về cmd nữa, mọi người có thể vào đây để đọc tiếp.
- Khi viết table, gõ | xong ấn enter thì bị chuyển thành ký tự của
emoticon, cứ phải ấn cách rồi mới enter được, rất là không tiện, khiến
những người đến ngày như mình rất rễ bực mình.
- Sau khi xóa/cut ký tự nào đó để mà con trỏ chuột chạm vào dấu | thì không dùng phím điều hướng trên bàn phím được
-_-
(máy tính windows 10 chạy chrome)