วันอาทิตย์ที่ 7 เมษายน พ.ศ. 2556

ปูพื้นฐานแบตช์ไฟล์ 3

อะ...วันนี้..เรามาปูพื้นฐานเกี่ยวกับคำสั่ง GoTo (โกทู...) คำสั่งนี้...นับเป็นคำสั่งที่โบราณที่สุดเท่าที่ภาษาระดับสูงมีมา...เพราะมันเป็นคำสั่งที่ใช้ควบคุมการทำงานโดยย้ายการทำงานของคำสั่ง...ไปที่นั่น...ที่นี่...หรือบางคนเขียนไม่เป็น มันจะเกิด Loop Over Flow ; เอมันคืออะไร... มันคือการกระโดดไปมาอย่างไม่มีที่สิ้นสุดไม่รู้ว่าจะจบเมื่อไหร่...เป็นเหตุให้ CPU ทำงานเกินความสามารถและแจ้ง Error ออกมา หรือบางครั้ง...มัน "แฮงค์" เลย เรามาเรียนรู้กันเลย...พิมพ์

C:\Users\Administrator>goto /?
Directs cmd.exe to a labeled line in a batch program.

GOTO label

  label   Specifies a text string used in the batch program as a label.

You type a label on a line by itself, beginning with a colon.

If Command Extensions are enabled GOTO changes as follows:

GOTO command now accepts a target label of :EOF which transfers control
to the end of the current batch script file.  This is an easy way to
exit a batch script file without defining a label.  Type CALL /?  for a
description of extensions to the CALL command that make this feature
useful.

คำสั่งนี้ทำงานดังนี้

GOTO :MSG1 ; ไปยังตำแหน่ง MSG1
MSG %username% "กล่องข้อความนี้ไม่สามารถแสดงได้...เพราะถูกข้ามด้วยคำสั่ง Goto" ; ไม่สามารถแสดงข้อความได้
:MSG1 ; ตำแหน่ง MSG1
MSG %username% "กระโดดมาที่ MSG1 เพื่อแสดงข้อความ" ; แสดงข้อความ

GOTO :MSG1 ; ไปยังตำแหน่ง MSG1
:MSG2 ; ตำแหน่ง MSG2
MSG %username% "กล่องข้อความที่ 2" ; แสดงข้อความถัดมา
GOTO :END ; และกระโดดไปท้ายแบตช์ไฟล์
:MSG1 ; ตำแหน่ง MSG1
MSG %username% "กล่องข้อความที่ 1" ; แสดงข้อความแรก
GOTO MSG2 ; วนกลับไปตำแหน่ง MSG2
:END ; สิ้นสุดคำสั่ง...(ต้องมี...เพื่อให้แบตช์ไฟล์หาจุดสิ้นสุดคำสั่งได้)

GOTO :MSG1 ; ไปยังตำแหน่ง MSG1
:MSG2 ; ตำแหน่ง MSG2
MSG %username% "กล่องข้อความที่ 2 (วนไม่รู้จบ) เรียก Loop Over Flow" ; แสดงข้อความถัดมา
:MSG1 ; ตำแหน่ง MSG1
MSG %username% "กล่องข้อความที่ 1 (วนไม่รูจบ) เรียก Loop Over Flow" ; แสดงข้อความแรก
GOTO MSG2 ; ไปยังตำแหน่ง MSG2 (และึคำสั่งจะไหลการทำงานมาบรรทัดนี้...ใหม่และวนกลับไปอย่างไม่รู้จบ)

คำสั่งต่อไป...ที่ต้องใช้งานควบคุมการงานของแบตช์ไฟล์เช่นกันเพื่อความเป็นมืออาชีพ CALL (คอล์ ...)

C:\Users\Administrator>call /?
Calls one batch program from another.

CALL [drive:][path]filename [batch-parameters]

  batch-parameters   Specifies any command-line information required by t
                     batch program.

If Command Extensions are enabled CALL changes as follows:

CALL command now accepts labels as the target of the CALL.  The syntax
is:

    CALL :label arguments

A new batch file context is created with the specified arguments and
control is passed to the statement after the label specified.  You must
"exit" twice by reaching the end of the batch script file twice.  The
first time you read the end, control will return to just after the CALL
statement.  The second time will exit the batch script.  Type GOTO /?
for a description of the GOTO :EOF extension that will allow you to
"return" from a batch script.

In addition, expansion of batch script argument references (%0, %1,
etc.) have been changed as follows:


    %* in a batch script refers to all the arguments (e.g. %1 %2 %3
        %4 %5 ...)

    Substitution of batch parameters (%n) has been enhanced.  You can
    now use the following optional syntax:

        %~1         - expands %1 removing any surrounding quotes (")
        %~f1        - expands %1 to a fully qualified path name
        %~d1        - expands %1 to a drive letter only
        %~p1        - expands %1 to a path only
        %~n1        - expands %1 to a file name only
        %~x1        - expands %1 to a file extension only
        %~s1        - expanded path contains short names only
        %~a1        - expands %1 to file attributes
        %~t1        - expands %1 to date/time of file
        %~z1        - expands %1 to size of file
        %~$PATH:1   - searches the directories listed in the PATH
                       environment variable and expands %1 to the fully
                       qualified name of the first one found.  If the
                       environment variable name is not defined or the
                       file is not found by the search, then this
                       modifier expands to the empty string

    The modifiers can be combined to get compound results:

        %~dp1       - expands %1 to a drive letter and path only
        %~nx1       - expands %1 to a file name and extension only
        %~dp$PATH:1 - searches the directories listed in the PATH
                       environment variable for %1 and expands to the
                       drive letter and path of the first one found.
        %~ftza1     - expands %1 to a DIR like output line

    In the above examples %1 and PATH can be replaced by other
    valid values.  The %~ syntax is terminated by a valid argument
    number.  The %~ modifiers may not be used with %*

อื่ม...มันทำงานอย่างไร...มันทำงานเป็นส่วนขยายของ GOTO และที่ GOTO ทำไม่ได้คือ กระโดดไป...และกลับมายังบรรทัดถัดไป

CALL :MSG1 ; ไปยังโมดูลแสดงข้อความแรก
CALL :MSG2 ; ไปยังโมดูลแสดงข้อความที่สอง
GOTO :END ; ไปยังสิ้นสุดโปรแกรม
:MSG1 ; ตำแหน่ง MSG1
MSG %username% "แสดงข้อความที่ 1 และย้อนกลับไป...บรรทัดถัดไป" ; แสดงข้อความแรก
GOTO :END ; ไปยังสิ้นสุดโปรแกรม (เพื่อไม่ให้การทำงานไหลไปบรรทัดถัดไป)
:MSG2 ; ตำแหน่ง MSG2
MSG %username% "แสดงข้อความที่ 2 และย้อนกลับไป...บรรทัดถัดไป" ; แสดงข้อความถัดไป
GOTO :END ; ไปยังสิ้นสุดโปรแกรม (เพื่อไม่ให้การทำงานไหลไปบรรทัดถัดไป)
:MSG3 ; ตำแหน่ง MSG3
MSG %username% "ข้อความนี้ถูกข้ามไป...เพราะไม่มีการเรียกโมดูล" ; ข้อความไม่ถูกแสดง
:END ; ตำแหน่งสิ้นสุดแบตช์ไฟล์

ประยุกต์ใช้งานอย่างเทพ...

CALL :MSGALL "แสดงข้อความโมดูลนี้ครั้งแรก..." ; เรียกโมดูลอรรถประโยชน์ และแสดงข้อความแรก
CALL :MSGALL "แสดงข้อความโมดูลนี้ครั้งที่สอง..." ; เรียกโมดูลอรรถประโยชน์ แสดงข้อความสอง
CALL :MSGALL "แสดงข้อความโมดูลนี้ครั้งที่สาม..." ; เรียกโมดูลอรรถประโยชน์ แสดงข้อความสาม
GOTO :END ; กระโดดไปยังตำแหน่งสุดท้าย...(เพื่อไม่ให้ไหลการทำงานไปบรรทัดถัดไป)
:MSGALL %1 ; ตำแหน่งโมดูลอรรถประโยชน์ MSGALL
MSG %username% %1 ; แสดงข้อความ ผ่าน อาร์กิวเมนต์ที่ 1
:END ; สิ้นสุดการทำงาน

จะเห็นว่า...การทำงานง่าย...และคำสั่งทำงานสั้นลงมาก...ซึ่งประยุกต์ใช้งานในการแสดง "ข้อความ Error" สำหรับแบตช์ไฟล์

อย่างมืออาชีพ...ผมจะไม่พยามรื้อฟื้นคำสั่งโบราณหรือวิธีการโบราณเพื่อสอน...แต่ประยุกค์การใช้งานชั้นสูงเพื่อให้คุณเขียน

โปรแกรมอย่างโปรแกรมเมอร์มืออาชีพ...และมีทักษะการเขียนโปรแกรมที่ดี...อะไรที่ไม่จำเป็นก็ตัดออกไป...จากตัวอย่าง %1 มัน

คืออะไร...
    %* in a batch script refers to all the arguments (e.g. %1 %2 %3
        %4 %5 ...)
มันคือ "อาร์กิวเมนต์" หรือ "ตัวแปรภายนอก" ของโมดูลในแบตช์ไฟล์ ซึ่งสามารถส่งผ่านมาได้...ด้วยการเว้นวรรค...เหมือน

"Parameter; พารามิเตอร์" ของแบตช์ไฟล์ผ่านคอมมานด์ไลน์ เช่น
DIR *.BAT
ไอ้ *.BAT คือ %1 หรือ พารามิเตอร์ของ แบตช์ไฟล์ แต่ถ้าเราเรียกใช้งานในโมดูลหรือคำสั่ง CALL ของแบตช์ไฟล์เราเรียกอาร์กิวเมนต์ และอาร์กิวเมนต์เอง...ก็สามารถสืบทอด พารามิเตอร์เป็นทอดๆ ได้เช่นกันสรุป...การเขียนโปรแกรมเอง...ก่อนอื่นต้องนึกลำดับขั้นตอนให้ออก...และก็หัดเรียงลำดับความคิดออกเป็นสัญลักษณ์ โฟว์ชาร์ต...ซึ่งจะปูพื้นฐานกันในคราวหน้า...

ไม่มีความคิดเห็น:

แสดงความคิดเห็น