Viết kịch bản Terminal Service - Phần 1
Viết kịch bản Terminal Service - Phần 2
Viết kịch bản Terminal Service - Phần 3
Viết kịch bản Terminal Service - Phần 4
Viết kịch bản Terminal Service - Phần 5
Viết kịch bản Terminal Service - Phần 6
Viết kịch bản Terminal Service - Phần 7
Brien M. Posey
Quản trị mạng - Trong phần trước của loạt bài này, chúng tôi đã giới thiệu cho các bạn cách sử dụng lệnh Echo để làm cho đầu ra kịch bản trở lên dễ đọc hơn. Chúng tôi cũng đã nói về những nhu cầu cần phải tạo các file bản ghi với tên file theo ngày hiện hành để tránh hiện tượng bị ghi đè lên các file bản ghi đã được tạo trước đó. Mặc dù đã giới thiệu cho các bạn các lệnh cần thiết để tạo các filename theo ngày hiện hành cho các file bản ghi nhưng chúng tôi vẫn chưa giới thiệu cách làm việc của các lệnh này như thế nào. Chính vì vậy trong phần tiếp theo này, chúng tôi muốn tiếp tục loạt bài bằng cách giải thích các lệnh đã được sử dụng sâu hơn nữa.
Tạo FileName theo ngày
Để dễ hình dung, chúng tôi đã tạo kịch bản trong phần trước của loạt bài này dưới đây:
@Echo Off
Echo Creating log file.
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set datefile=%%i%%j%%k.log
Query User > %datefile%
Echo Log file đã tạo thành công.
Trong hai dòng đầu tiên của kịch bản này, lệnh @Echo Off có nghĩa là không hiển thị các lệnh khi chúng thực thi và lệnh Echo Creating Log File có nghĩa để hiển thị cụm từ Creating Log File. Dòng thứ ba của kịch bản chính là dòng tạo filename.
Như những gì bạn có thể thấy, lệnh này bắt đầu bằng cách sử dụng lệnh For. Chúng tôi vẫn chưa nói về lệnh For này vì nó không liên quan trực tiếp tới Terminal Services, nhưng đây quả thực cũng là một lệnh rất hữu dụng đối với bạn vì nó có thể cho phép bạn tạo thêm các kịch bản mạnh hơn.
Nếu quan sát dòng mã bên dưới, bạn sẽ thấy có hai phần chính cho lệnh For. Đó là phần For và phần Do. Phần For thiết lập các điều kiện mà bạn cần phải có. Phần Do thực thi lệnh khác khi các điều kiện được thỏa mãn.
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set datefile=%%i%%j%%k.log
Trong trường hợp cụ thể, phần For của lệnh này sẽ giống như dưới đây:
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t')
Còn phần Do:
Do set datefile=%%i%%j%%k.log
Về cơ bản phần Do sẽ sử dụng lệnh Set để phổ biến một biến có tên Datefile với filename được tạo bởi phần For của lệnh.
Chúng tôi muốn ngắt từng phần để thử nghiệm cùng với bạn.
Với phần For
Lúc này, chúng ta hãy tạm quên đi phần Do của lệnh và tập trung vào phần For, xem thể hiện bên dưới:
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t')
Những gì về cơ bản lệnh này đang thực hiện là import các thẻ cụ thể khi lệnh DATE /T được thực thi. Rõ ràng điều này làm xuất hiện một số câu hỏi, chẳng hạn như DATE /T thực hiện những gì và thẻ ở đây là gì?
Nếu bạn quan sát kỹ hơn trong hình A, bạn có thể thấy nơi chúng tôi đã thực thi lệnh DATE /T. Như những gì nhìn thấy trong hình , lệnh này đơn giản hiển thị ngày trong tuần và sau đó hiển thị tháng và năm theo định dạng số. Chúng tôi sẽ sử dụng một số thông tin này để tạo filename nhưng không thể tạo một filename bằng thông tin này theo biểu mẫu thô của nó.
Hình A: Đây là những gì khi bạn nhập vào lệnh DATE /T
Đây chính là điểm xuất hiện của các thẻ. Lưu ý từ IN, đứng trước lệnh DATE /T. Điều này sẽ cho phép kết hợp với lệnh For mà chúng ta đang kéo thông tin bên trong từ lệnh DATE /T. Khi thực hiện điều đó, Windows sẽ xử lý mỗi mẩu thông tin riêng biệt như một thẻ. Trong trường hợp này, có 4 thẻ phân biệt đang được đọc ở trong. Các thẻ này là:
- Sun
- 05
- 11
- 2008
Lúc này bạn có thể thấy, khi chúng ta nhập vào lệnh DATE /T, Windows sẽ hiển thị ngày thực với tư cách là một chuỗi các thông tin liên tục (05/11/2008) chứ không phỉa các mẫu thông tin riêng (05, 11, 2008). Đây chính là lý do tại sao nó lại có thể xử lý chuỗi văn bản này với tư cách ba thẻ phân biệt là vì chúng ta sử dụng một dấu phân cách. Dấu phân cách sẽ giúp cho lệnh nhận biết rằng bất cứ khi nào nó bắt gặp một ký tự nào đó thì sẽ xử lý văn bản theo sau ký tự đó với tư cách là một thẻ riêng biệt.
Nếu xem xét lại lệnh ban đầu của chúng ta, bạn sẽ thấy một phần của lệnh như dưới đây:
Delims=/%%i
Phần thứ nhất của lệnh này (delims=/) sẽ làm cho Windows biết rằng dấu phân cách là ký tự /. Đây là những gì làm ngăn cách chuỗi văn bản theo các thẻ phân biệt. Phần %%i của lệnh gán thẻ với biến có tên %%I.
Lúc này, chúng ta hãy xem xét đến phần Tokens= của lệnh:
tokens=2,3,4
Phần này của lệnh dùng để capture các thẻ thứ hai, ba và tư. Trong trường hợp này, thẻ đầu tiên là Sun, đây là phần đầu ra mà chúng ta không quan tâm đến, chính vì vậy chúng tôi không giới thiệu về nó. Thẻ thứ hai là 05 và chúng ta sẽ đặt giá trị đó vào biến có tên %%I. Lúc này bạn có thể thấy rằng chúng ta đang capture hai thẻ bổ sung (3 và 4), tuy nhiên chúng ta lại không tuyên bố bất kỳ một biến thêm nào. Chúng ta cũng không để ý đến những phần này. Windows sẽ xử lý %%I với tư cách một điểm khởi đầu. Nó sẽ tự động sử dụng %%J như một biến để giữ giá trị của thẻ số ba, và %%K là giá trị của thẻ số 4.
OK, tất cả điều này dường như có một chút trừu tượng, chính vì vậy chúng tôi muốn minh chứng một số khái niệm về vấn đề mà chúng ta đang nói về. Để giúp các bạn thấy được những gì đang diễn ra, chúng tôi đã tạo kịch bản bên dưới:
@echo off
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set tkn2=%%i
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set tkn3=%%j
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set tkn4=%%k
Echo Token number 2 = %tkn2%
Echo Token number 3 = %tkn3%
Echo Token number 4 = %tkn4%
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set datefile=%%i%%j%%k.log
Echo The DATEFILE variable = %datefile%
Chúng tôi đã đề cập từ trước rằng phần DO của lệnh For sẽ thực thi các lệnh khác khi các điều kiện trong phần For thỏa mãn. Trong kịch bản gốc, phần Do của lệnh đã tạo một biến có tên Datefile, biến này được tạo lên từ các giá trị của các thẻ thứ hai, ba và tư. Sau đó chúng tôi đã gắn thêm phần mở rộng .LOG vào phần cuối của giá trị để có thể sử dụng nó với tư cách là một filename.
Với lưu ý đó, chúng ta hãy xem xét kịch bản mẫu ở trên. Ba lệnh đầu tiên rất giống với lệnh For gốc, ngoại trừ thay cho việc tạo filename, các lệnh này lại kết xuất các nội dung của các thẻ thứ hai, ba và tư vào các biến có tên tương ứng là TKN2, TKN3 và TKN4.
Ba dòng tiếp theo hiển thị nội dung của các biến này. Lưu ý rằng bất cứ thời điểm nào bạn sử dụng lệnh Echo để hiển thị nội dung của một biến nào đó thì biến đó phải được đặt trong các dấu “%”.
Lệnh thứ hai đến lệnh cuối cùng trong kịch bản trên là lệnh gốc của chúng ta để biên dịch một filename dựa trên các giá trị của mỗi thẻ, sau đó gắn thêm phần mở rộng .LOG vào filename. Như những gì bạn thấy trong lệnh, filename được lưu dưới dạng một biến có tên DATEFILE. Dòng cuối cùng của kịch bản có tác dụng hiển thị nội dung của biến DATEFILE.
Bạn có thể thấy những gì thể hiện của kịch bản khi nó được thực thi trong hình B.
Hình B: Kịch bản mẫu thể hiện cách các thẻ và các biến đang được sử dụng
Hãy quay trở lại kịch bản gốc của chúng ta, kịch bản được thể hiện lại bên dưới:
@Echo Off
Echo Creating log file.
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set datefile=%%i%%j%%k.log
Query User > %datefile%
Echo Log file created successfully.
Như những gì bạn thấy, dòng thứ hai đến dòng cuối cùng trong kịch bản này gọi lệnh QUERY USER, đây là lệnh kịch bản đặc trưng của terminal service. Chúng tôi đã giải thích cho các bạn về nó trong phần trước của loạt bài rằng dấu “>” sẽ làm cho kịch bản kết xuất các đầu ra của lệnh vào một file nào đó. Dấu “>” này được theo sau %DATEFILE%, đây là biến chứa tên file mà chúng ta đã biên dịch.
Kết luận
Trong phần này, chúng tôi đã giới thiệu cách sử dụng một kịch bản mẫu để tạo một filename. Trong phần tiếp theo của loạt bài này, chúng tôi sẽ tiếp tục giới thiệu về một số kỹ thuật kịch bản khác để các bạn sử dụng trong môi trường Terminal Service.