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
Viết kịch bản Terminal Service - Phần 8
Viết kịch bản Terminal Service - Phần 9
Viết kịch bản Terminal Service - Phần 10
Viết kịch bản Terminal Service - Phần 11
Quản trị mạng - Phần 12 này chúng tôi dự định sẽ quay trở lại một số những vấn đề đã nêu còn thiếu trong phần 10 và hoàn tất các kịch bản trong đó.
Những vấn đề cần bổ sung
Vấn đề lớn nhất với kịch bản vẫn còn tồn tại đó là nó phải cho phép bạn tạo một bản ghi và xem các nội dung trong file bản ghi, tuy nhiên nó lại chỉ cho phép bạn xem các file bản ghi hiện hành. Chính vì vậy chúng ta cần thay đổi một chút về kịch bản đề bạn có thể xem và in các file bản ghi trước đó. Ở đây sẽ không có việc tạo lại cơ chế ghi chép sử dụng các tên file duy nhất cho mỗi bản ghi.
Khó khăn lớn nhất trong việc xem các file bản ghi hoặc in các bản ghi có trước là người dùng cần phải nhập vào tên file bản ghi họ muốn xem hoặc in đó. Việc sử dụng đầu vào mà người dùng nhập vào luôn là một thách thức khó khăn đối với ngôn ngữ lập kịch bản .bat mà chúng ta đang sử dụng. Cho tới tận khi Windows 2000 được phát hành thì điều đó mới trở lên đơn giản hơn đôi chút trong việc xử lý này. Cũng có nhiều cách “đường vòng” để nhập vào đầu vào này vào thực hiện những hành động dựa trên các thông tin đó tuy nhiên chúng rất khó khăng trong việc viết mã. Khắc phục vấn đề đó Microsoft đã tăng cường thêm một lệnh Set vào khóa chuyển đổi /P. Khóa chuyển đổi sẽ cho phép đầu vào của người dùng được gán vào một biến. Biến này có ngay từ Windows 2000 và sau này nó cũng gồm có cả trong các phiên bản kế sau của Windows.
Cú pháp của lệnh rất đơn giản và được thể hiện như dưới đây:
Set /P variable=Prompt string
Trong lệnh trên, bạn cần phải thay thế từ “variable” bằng một tên biến thực sự mà bạn muốn sử dụng. Prompt string là chỗ bạn có thể nhập vào phần văn bản muốn Windows hiển thị trước khi hỏi người dùng về đầu vào.
Để có hiểu được về cách làm việc của lệnh này, chúng ta hãy đi xem xét ba dòng mã dưới đây:
@echo off
set /P var=type something
echo %var%
Kịch bản đơn giản này sẽ yêu cầu người dùng nhập vào thứ gì đó, sau đó sẽ hiển thị bất cứ thứ gì được đánh vào. Trong dòng đầu tiên của kịch bản, chúng tôi sử dụng lệnh “@echo off” để remove clutter khỏi đầu ra của kịch bản.
Dòng thứ hai yêu cầu đầu vào của người dùng. Trong trường hợp này, chúng tôi đã sử dụng biến “var” và “prompt string” là “Type Something”.
Dòng cuối cùng trong kịch bản trên sử dụng lệnh “echo” để hiển thị các nội dung của các biến. Lưu ý rằng chúng tôi đã đánh dấu biên trong các dấu %.
Lúc này bạn đã biết về cách lấy đầu vào của người dùng, cách tham chiếu biến mà người dùng nhập vào, chúng ta hãy xem kỹ thuật này làm việc như thế nào trong kịch bản của mình. Như kịch bạn hiện tồn tại trong các phần trước, người dùng nhập vào tùy chọn menu B để xem báo cáo từ trước. Bằng cách thực hiện đó, kịch bản sẽ gọi một thường trình có tên :sub_view:
:sub_view
echo You chose to view a report
for /F "tokens=2,3,4 delims=/ " %%i in ('date /t') do set datefile=%%i%%j%%k.log
Type %datefile%.log |More
goto:eof
Trong biểu mẫu hiện hành của nó, thường trình này chỉ đơn giản tính toán một file name dựa trên ngày hôm nay và sau đó sẽ hiển thị file name. Mặc dù vậy, chúng ta hoàn toàn có thể thay đổi một cách dễ dàng thường trình này để nó sẽ yêu cầu người dùng nhập vào ngày, tháng, năm của báo cáo muốn xem. Khi người dùng nhập vào đầy đủ các thông tin này, chúng ta có thể sử dụng chúng để xây dựng một file name và sau đó lấy về báo cáo mong muốn. Đoạn mã để thực hiện công việc trên như sau:
:sub_view
echo You chose to view a report
set /P mth=Please enter the month in a two digit format (01 to 12)
set /p dy=Please enter the day on which the report was created in a two digit format (01 to 31)
set /p yr=Please enter the year of the report in a four digit format (2008)
set datefile=%mth%%dy%%yr%.log
echo.
Type %datefile% |More
goto:eof
Đoạn mã này để lại rất nhiều khả năng trong biểu mẫu hiện hành của nó. Tuy nhiên, trong phần này chúng tôi không thực hiện bất cứ thứ gì để hợp lệ hóa đầu vào và bảo đảm rằng dải số hợp lệ đó được nhập mà chúng tôi chỉ nhắm đến vấn đề hợp lệ hóa đầu vào các phần sau. Lúc này, chúng tôi sẽ giới thiệu cho các bạn cách lấy các dòng đầu vào và sau đó tập trung vào đầu vào đó trong một biến môi trường, thứ mà chúng ta có thể sử dụng cho một file name.
Trong trường hợp riêng này, chúng tôi đã sử dụng biến có tên “mth” để lưu giữ giá trị tháng. Sử dụng “dy” để lưu giữ giá trị ngày trong tháng và sử dụng “yr” cho năm. Không thể để rõ ràng tháng, ngày và năm vì chúng đều là các từ dành riêng và bạn không thể sử dụng các từ dành riêng này cho tên các biến.
Khi kết thúc việc lấy đầu vào của người dùng, chúng tôi đã jond các biến vào bằng lệnh “set”, sau đó gắn thêm .log vào cuối chuỗi biến để thành tên file. Tiếp đó gán file name cho biến đã được đặt tên datefile. Tất cả những vấn đề đó được thực hiện trong trong dòng mã bên dưới:
set datefile=%mth%%dy%%yr%.log
Nếu nhìn vào hình A, bạn sẽ thấy kịch bản khi chạy.
Hình A: Đây là kịch bản khi nó thực thi
Thứ cuối cùng mà chúng tôi muốn giới thiệu cho các bạn trong phần này là tùy chọn menu C, đây là tùy chọn cho phép chúng ta in ra một báo cáo. Cho đến đây, chúng ta vẫn chưa viết ra bất cứ đoạn mã nào cho tùy chọn menu này. Lý do cho điều đó là đoạn mã mà chúng ta sử dụng sẽ giống hệt với đoạn mã mà chúng ta sử dụng để xem file bản ghi. Nếu bạn quan sát vào thường trình mà chúng ta đang làm việc khi đó bạn sẽ thấy từ thứ hai từ dòng mã cuối cùng là một lệnh hiển thị các nội dung của file bản ghi. Bằng cách tạo một điều chỉnh đơn giản trong dòng mã này, chúng ta hoàn toàn có thể chuyển hướng đầu ra từ màn hình ra máy in.
Dưới đây là hai dòng mã đó. Dòng đầu tiên hiển thị file bản ghi ra màn hình. Lệnh thứ hai sẽ in file bản ghi đó ra máy in. Bằng cách đặt hai dòng cạnh nhau, bạn có thể thấy chúng giống và khác nhau ở những đâu.
Type %datefile% |More
Type %datefile% >lpt1
Trong ngôn ngữ lập trình .bat mà chúng ta đang sử dụng, dấu > mách bảo cho kịch bản thực hiện chuyển hướng (redirection). LPT1 sẽ mách bảo kịch bản thực hiện chuyển hướng sang máy in. Có hai sự kiện bạn cần biết ở đây.
Đầu tiên đó là cho kỹ thuật này làm việc, LPT1 phải được capture vào máy in. Thứ hai, một số máy in sẽ yêu cầu một feed biểu mẫu để hoàn tất công việc in ấn. Nếu gặp phải tình huống này thì bạn cần add dòng mã dưới đây vào kịch bản:
Echo .&10h >lpt1
Bạn có thể thấy đoạn mã đầy đủ dưới đây:
@echo off
set _menu=D
:Loop
cls
Echo What do you want to do?
Echo A: Create a new Query Users report|
Echo B: View a Previous Report
Echo C: Print a Previous Report
Echo.
Echo D: Quit
Echo.
Set /P _menu=Please enter your choice:
if not "%_menu%"=="" set _menu=%_menu:~0,1%
REM echo %_menu%
If /i "%_menu%"=="A" goto sub_create
If /i "%_menu%"=="B" goto sub_view
If /i "%_menu%"=="C" goto sub_print
if /I "%_menu%"=="D" goto:eof
goto:loop
:sub_create
echo You chose to create a report
@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.
goto:eof
:sub_view
echo You chose to view a report
set /P mth=Please enter the month in a two digit format (01 to 12)
set /p dy=Please enter the day on which the report was created in a two digit format (01 to 31)
set /p yr=Please enter the year of the report in a four digit format (2008)
set datefile=%mth%%dy%%yr%.log
echo.
Type %datefile% |More
goto:eof
:sub_print
echo You chose to print a report
set /P mth=Please enter the month in a two digit format (01 to 12)
set /p dy=Please enter the day on which the report was created in a two digit format (01 to 31)
set /p yr=Please enter the year of the report in a four digit format (2008)
set datefile=%mth%%dy%%yr%.log
echo.
Type %datefile% >lpt1
Echo .&10h >lpt1
goto:eof
Kết luận
Trong phần này chúng tôi đã giới thiệu cho các bạn cách lấy đầu vào và sử dụng đầu vào mà người dùng nhập vào trong các kịch bản. Trong phần tiếp theo của loạt bài này, chúng tôi sẽ giới thiệu cho các bạn cách áp dụng khái niệm này vào kịch bản mà chúng ta tạo trong phần 11.