HP OpenVMS Systems Documentation

Content starts here

B 주석 명령 프로시저
이 부록에는 13장, 14장 및 15장에 설명된 개념과 기술에 대한 전체 명령 프로시저가 포함되어 있습니다. 이 부록의 각 절에서는 명령 프로시저를 설명하고 다음 정보를 제공합니다.
프로시저 이름
프로시저 목록
프로시저에 사용되는 개념 또는 기술을 설명하는 참조 내용
프로시저의 보기 실행 결과
CONVERT.COM 명령 프로시저
이 명령 프로시저는 절대 시간(미래 시간)을 변경 시간으로 변환하고 현재 시간과 사용자가 지정한 시간 간의 시간 차이를 결정합니다. 이 프로시저에서는 F$TIME 및 F$CVTIME 렉시칼 함수와 할당문을 사용하여 산술 계산을 수행하고 기호 값을 연결하는 방법을 보여 줍니다.
보기: CONVERT.COM
$ ! Procedure to convert an absolute time to a delta time.
$ ! The delta time is returned as the global symbol WAIT_TIME.
$ ! P1 is the time to be converted.
$ ! P2 is an optional parameter - SHOW - that causes the
$ ! procedure to display WAIT_TIME before exiting
$ !
$ ! Check for inquiry
$ !
$ IF P1 .EQS. "?" .OR. P1 .EQS. "" THEN GOTO TELL [1]
$ !
$ ! Verify the parameter: hours must be less than 24
$ ! minutes must be less than 60
$ ! time string must contain only hours
$ ! and minutes
$ !
$ ! Change error and message handling to
$ ! use message at BADTIME
$ !
$ ON WARNING THEN GOTO BADTIME [2]
$ SAVE_MESSAGE = F$ENVIRONMENT("MESSAGE")
$ SET MESSAGE/NOFACILITY/NOIDENTIFICATION/NOSEVERITY/NOTEXT
$ TEMP = F$CVTIME(P1)
$ !
$ ! Restore default error handling and message format
$ ON ERROR THEN EXIT
$ SET MESSAGE'SAVE_MESSAGE'
$ !
$ IF F$LENGTH(P1) .NE. 5 .OR. - [3]
F$LOCATE(":",P1) .NE. 2 -
THEN GOTO BADTIME
$ !
$ ! Get the current time
$ !
$ TIME = F$TIME() [4]
$ !
$ ! Extract the hour and minute fields from both the current time
$ ! value (TIME) and the future time (P1)
$ !
$ MINUTES = F$CVTIME(TIME,"ABSOLUTE","MINUTE") ! Current minutes [5]
$ HOURS = F$CVTIME(TIME,"ABSOLUTE","HOUR") ! Current hours
$ FUTURE_MINUTES = F$CVTIME(P1,"ABSOLUTE","MINUTE") ! Minutes in future time
$ FUTURE_HOURS = F$CVTIME(P1,"ABSOLUTE","HOUR") ! Hours in future time
$ !
$ !
$ ! Convert both time values to minutes
$ ! Note the implicit string to integer conversion being performed
$ ! $ CURRENT_TIME = HOURS*60 + MINUTES [6]
$ FUTURE_TIME = FUTURE_HOURS*60 + FUTURE_MINUTES
$ !
$ ! Compute difference between the future time and the current time
$ ! (in minutes)
$ !
$ !
$ MINUTES_TO_WAIT = FUTURE_TIME - CURRENT_TIME [7]
$ !
$ ! If the result is less than 0 the specified time is assumed to be
$ ! for the next day; more calculation is required.
$ !
$ IF MINUTES_TO_WAIT .LT. 0 THEN - [8]
MINUTES_TO_WAIT = 24*60 + FUTURE_TIME - CURRENT_TIME
$ !
$ ! Start looping to determine the value in hours and minutes from
$ ! the value expressed all in minutes
$ !
$ HOURS_TO_WAIT = 0
$ HOURS_TO_WAIT_LOOP: [9]
$ IF MINUTES_TO_WAIT .LT. 60 THEN GOTO FINISH_COMPUTE
$ MINUTES_TO_WAIT = MINUTES_TO_WAIT - 60
$ HOURS_TO_WAIT = HOURS_TO_WAIT + 1
$ GOTO HOURS_TO_WAIT_LOOP
$ FINISH_COMPUTE:
$ !
$ ! Construct the delta time string in the proper format
$ !
$ WAIT_TIME == F$STRING(HOURS_TO_WAIT)+ ":" + F$STRING(MINUTES_TO_WAIT)- [10]
+ ":00.00"
$ !
$ ! Examine the second parameter
$ !
$ IF P2 .EQS. "SHOW" THEN SHOW SYMBOL WAIT_TIME [11]
$ !
$ ! Normal exit
$ !
$ EXIT
$ !
$ BADTIME: [12]
$ ! Exit taken if first parameter is not formatted correctly
$ ! EXIT command returns but does not display error status
$ !
$ SET MESSAGE'SAVE_MESSAGE'
$ WRITE SYS$OUTPUT "Invalid time value: ",P1,", format must be hh:mm"
$ WRITE SYS$OUTPUT "Hours must be less than 24; minutes must be less than 60"
$ EXIT %X10000000
$ !
$ !
$ TELL: [13]
$ ! Display message and exit if user enters inquiry or enters
$ ! an illegal parameter
$ !
$ TYPE SYS$INPUT
This procedure converts an absolute time
value to a delta time value. The absolute time must be in
the form hh:mm and must indicate a time in the future.
On return, the global symbol WAIT_TIME contains the
converted time value. If you enter the keyword SHOW
as the second parameter, the procedure displays the
resulting value in the output stream. To invoke this
procedure, use the following syntax:

@CONVERT hh:mm [SHOW]
$ EXIT
CONVERT.COM 명령 프로시저 설명
[1] 이 프로시저에서는 매개 변수가 생략되었는지 또는 매개 변수에 입력된 값이 물음표(?) 문자인지를 검사합니다. 두 경우 모두 프로시저가 레이블 TELL에서 분기됩니다.
[2] 이 프로시저는 F$CVTIME 함수를 사용하여 시간 값이 유효한 24시간 단위 표기법으로 입력되었는지 확인합니다. F$CVTIME 함수는 입력 시간이 유효하지 않은 경우 경고 메시지를 반환합니다. F$CVTIME 함수가 오류를 반환할 경우 프로시저는 기본값 ON 동작을 레이블 BADTIME에 대한 직접 제어로 변경합니다.
프로시저는 F$ENVIRONMENT 함수를 사용하여 현재 메시지 설정을 저장합니다. 그런 다음 경고 또는 오류 메시지가 표시되지 않도록 메시지 형식을 설정합니다. 시간 값을 검사한 다음 프로시저는 기본값 On 조건과 메시지 형식을 복원합니다.
[3] 프로시저는 매개 변수의 형식을 검사합니다. 매개 변수는 다음과 같은 형식의 시간 값이어야 합니다.
hh:mm
IF 명령어는 (1) 입력된 값의 길이가 5자이고 (2) 세 번째 문자(2의 오프셋)가 콜론(:)인지 확인합니다. IF 명령어는 논리 OR 연산자를 포함합니다. 두 표현식 중 하나가 참(길이가 5가 아니거나 세 번째 문자 위치가 콜론이 아닐 경우)일 경우 프로시저가 레이블 BADTIME에서 분기됩니다.
[4] F$TIME 렉시칼 함수는 현재 시간 값을 기호 TIME에 입력합니다.
[5] F$CVTIME 함수는 기호 TIME에 저장된 현재 시간으로부터 분” 및 시” 필드를 추출합니다. 그런 다음 F$CVTIME 함수는 변환할 시간으로부터 ”분” 및 시” 필드를 추출합니다.
[6] 이 할당문은 현재 시간과 미래 시간을 분으로 변환합니다. 할당문에 기호 MINUTES, HOURS, FUTURE_HOURS 및 FUTURE_MINUTES를 사용하면 이 값이 정수로 자동 변환됩니다.
[7] 그런 다음 프로시저는 미래 시간(분)에서 현재 시간(분)을 뺍니다.
[8] 결과가 0보다 작으면 미래 시간이 그 다음 날에 해당되는 것으로 해석됩니다. 이 경우 프로시저는 미래 시간에 24시간을 더한 다음 현재 시간을 뺍니다.
[9] 프로시저는 MINUTES_TO_WAIT 값으로부터 시간을 계산하는 루프를 입력합니다. 루프를 통과할 때마다 MINUTES_TO_WAIT가 60보다 큰지를 검사하여, 60보다 클 경우 MINUTES_TO_WAIT에서 60을 뺀 다음 시간 누적자(HOURS_TO_WAIT)에 1을 더합니다.
[10] 루프가 종료되면 프로시저는 시간 값과 분 값을 시간 문자열로 연결합니다. 기호 HOURS_TO_WAIT 및 MINUTES_TO_WAIT가 해당 문자열로 바뀌고 간섭 콜론으로 분리됩니다. 결과 문자열은 미래의 변경 시간 값을 보관하는 기호 WAIT_TIME에 할당됩니다. WAIT_TIME은 프로시저 CONVERT.COM이 종료될 때 삭제되지 않도록 글로벌 기호로 정의됩니다.
[11] 두 번째 매개 변수인 SHOW를 입력하면 프로시저는 결과 시간 값을 표시합니다. 그렇지 않으면 프로시저가 종료됩니다.
[12] 레이블 BADTIME에서 프로시저는 잘못 입력된 값과 필요한 형식을 보여 주는 오류 메시지를 표시합니다. 오류 메시지가 발행된 후 CONVERT.COM이 종료됩니다. EXIT 명령은 우선 순위 숫자가 1로 설정된 오류 상태를 반환합니다. 이 경우에는 오류 메시지가 표시되지 않습니다.
이 프로시저는 EXIT 명령을 사용하여 오류 상태를 명시적으로 지정하기 때문에 다른 프로시저에서 CONVERT.COM을 실행할 수 있습니다. CONVERT.COM이 완료되면 호출 프로시저에서 시간이 성공적으로 해석되었는지 확인할 수 있습니다.
[13] 레이블 TELL에서 이 프로시저는 프로시저가 수행하는 작업에 대한 정보를 표시합니다. TYPE 명령은 입력 데이터 스트림인 SYS$INPUT에 나열된 행을 표시합니다.
CONVERT.COM 명령 프로시저 보기 실행
$ SHOW TIME
10-JUN-1999 10:38:26
$@CONVERT 12:00 SHOW
WAIT_TIME = "1:22:00.00"
SHOW TIME 명령은 현재 날짜와 시간을 표시합니다. CONVERT.COM은 매개 변수 12:00 및 SHOW와 함께 실행됩니다. 이 프로시저에서는 절대 시간 12:00을 변경 시간 값으로 변환하여 터미널에 표시합니다.
REMINDER.COM 명령 프로시저
이 명령 프로시저는 지정된 시간에 터미널에 알림 메시지를 표시합니다. 이 프로시저는 메시지를 표시할 시간과 메시지의 텍스트를 묻는 프롬프트를 표시하고, CONVERT.COM을 사용하여 시간을 변경 시간으로 변환합니다. 그런 다음 지정된 시간이 되면 알림 메시지를 표시하는 하위 프로세스를 생성합니다. 이 프로시저에서는 F$ENVIRONMENT, F$VERIFY 및 F$GETDVI 함수의 사용을 보여 줍니다.
보기: REMINDER.COM
$ ! Procedure to obtain a reminder message and display this
$ ! message on your terminal at the time you specify.

$ !
$ ! Save current states for procedure and image verification
$ ! Turn verification off for duration of procedure
$
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") [1]
$ SAVE_VERIFY_PROC = F$VERIFY(0)
$ !
$ ! Places the current process in a wait state until a specified
$ ! absolute time. Then, it rings the bell on the terminal and
$ ! displays a message.
$ ! $ ! Prompt for absolute time
$ !
$
$ GET_TIME:
$ INQUIRE REMINDER_TIME "Enter time to send reminder (hh:mm)" [2]
$ INQUIRE MESSAGE_TEXT "Enter message"
$ !
$ ! Call the CONVERT.COM procedure to convert the absolute time
$ ! to a delta time
$ ! $ @DISK2:[JONES.TOOLS]CONVERT 'REMINDER_TIME' [3]
$ IF .NOT. $STATUS THEN GOTO BADTIME
$ !
$ !
$ ! Create a command file that will be executed
$ ! in a subprocess. The subprocess will wait until
$ ! the specified time and then display your message
$ ! at the terminal. If you are working at a DEC_CRT
$ ! terminal, the message has double size blinking
$ ! characters. Otherwise, the message has normal letters.
$ ! In either case, the terminal bell rings when the
$ ! message is displayed.
$
$ CREATE WAKEUP.COM [4]
$ DECK ! Lines starting with $ are data lines
$ WAIT 'WAIT_TIME' [5]
$ BELL[0,7] = %X07 ! Create symbol to ring the bell
$ IF F$GETDVI("SYS$OUTPUT","TT_DECCRT") .NES. "TRUE" THEN GOTO OTHER_TERM
$ !
$ DEC_CRT_ONLY:
$ ! Create symbols to set special graphics (for DEC_CRT terminals only)
$ !
$ SET_FLASH = "<ESC>[1;5m" ! Turn on blinking characters
$ SET_NOFLASH = "<ESC>[0m" ! Turn off blinking characters
$ TOP = "<ESC>#3" ! Double size characters (top portion)
$ BOT = "<ESC>#4" ! Double size characters (bottom portion)
$ !
$ ! Write double size, blinking message to the terminal and ring the bell
$ !
$ WRITE SYS$OUTPUT BELL, SET_FLASH, TOP, MESSAGE_TEXT
$ WRITE SYS$OUTPUT BELL, BOT, MESSAGE_TEXT
$ WRITE SYS$OUTPUT F$TIME(), SET_NOFLASH
$ GOTO CLEAN_UP
$ !
$ OTHER_TERM:
$ WRITE SYS$OUTPUT BELL,MESSAGE_TEXT
$ WRITE SYS$OUTPUT F$TIME()
$ !
$ CLEAN_UP:
$ DELETE WAKEUP.COM;*
$ EOD
$ !
$ ! Now continue executing commands.
$ !
$ SPAWN/NOWAIT/INPUT=WAKEUP.COM [6]
$ END: [7]
$ ! Restore verification
$ SAVE_VERIFY_PROC = F$VERIFY(SAVE_VERIFY_PROC, SAVE_VERIFY_IMAGE)
$ EXIT
$ !
$ BADTIME:
$ WRITE SYS$OUTPUT "Time must be entered as hh:mm"
$ GOTO GET_TIME
REMINDER.COM 명령 프로시저 설명
[1] 이 프로시저에서는 F$ENVIRONMENT 함수를 사용하여 기호 SAVE_VERIFY_IMAGE에 이미지 확인 설정을 저장합니다. 그런 다음 F$VERIFY 함수를 사용하여 기호 SAVE_VERIFY_PROC에 프로시저 확인 설정을 저장합니다.
또한, F$VERIFY 함수는 두 확인 유형을 모두 끕니다.
[2] 이 프로시저는 INQUIRE 명령을 사용하여 메시지가 발송되는 시간을 묻는 프롬프트를 표시합니다. 이 값은 프로시저 CONVERT.COM에 대한 입력으로 사용됩니다.
또한, 메시지의 텍스트를 묻는 프롬프트를 표시합니다.
[3] 이 프로시저는 중첩 프로시저인 CONVERT.COM을 실행합니다. 디스크와 디렉토리를 파일 지정 방법의 일부로 지정해야 합니다. 그러면 REMINDER.COM을 실행하는 위치에 관계 없이 시스템이 CONVERT.COM을 찾습니다.
CONVERT.COM은 알림을 변경 시간으로 변환하고 이 시간을 글로벌 기호 WAIT_TIME으로 반환합니다. 이 변경 시간은 현재 시간에서 메시지가 발송될 시간까지의 시간 간격을 나타냅니다. CONVERT.COM이 오류를 반환하면 프로시저가 레이블 BADTIME에서 분기됩니다.
[4] 이 프로시저는 CREATE 명령을 사용하여 새 프로시저인 WAKEUP.COM을 작성합니다. 이 프로시저는 하위 프로시저 내에서 실행됩니다. CREATE 명령이 달러 기호로 시작되는 행을 읽을 수 있게 하려면 CREATE 명령에 대한 입력을 DECK 명령과 EOD 명령 사이에 넣습니다. 따라서 DECK 명령과 EOD 명령 사이에 있는 모든 행은 WAKEUP.COM에 기록됩니다.
[5] WAKEUP.COM이 수행하는 작업은 다음과 같습니다.
기호 WAIT_TIME이 나타내는 시간이 될 때까지 기다립니다.
터미널 벨을 울리는 기호 BELL을 작성합니다.
터미널이 DEC_CRT 터미널이고 이스케이프 시퀀스를 적용하여 두 배 크기의 깜박이는 문자를 표시할 수 있는지 여부를 결정합니다. DEC_CRT 터미널인지 확인하려면 SHOW TERMINAL 명령을 입력하여 이 특성이 나열되는지 확인합니다.
터미널이 DEC_CRT 터미널일 경우 프로시저는 기호 SET_FLASH, TOP 및 BOT를 정의합니다. 이들 기호는 터미널이 반짝이는 두 배 크기 문자를 사용하게 합니다. 또한, 이 프로시저는 기호 SET_NOFLASH를 정의하여 터미널을 기본 상태로 복귀시킵니다. EDT 편집기를 사용하여 이 정의를 작성할 때 이스케이프 문자(<ESC>)를 입력하려면 ESC 키를 두 번 누릅니다.
이들 기호를 정의한 다음 프로시저는 터미널에 세 개의 행을 기록합니다. 첫 번째 행은 벨을 울리고, 반짝이는 문자를 켜고, 두 배 크기 문자를 사용하여 메시지의 상반부를 표시합니다. 두 번째 행은 벨을 다시 울리고 메시지의 하반부를 표시합니다. 세 번째 행은 현재 시간을 기록한 다음 반짝이는 문자를 해제하여 터미널을 기본 상태로 복귀시킵니다.
DEC_CRT 터미널이 없을 경우 프로시저는 터미널 벨을 울리고 메시지와 시간을 표시합니다.
DELETE 명령은 프로시저 WAKEUP.COM이 실행된 다음 삭제합니다.
[6] WAKEUP.COM이 작성되면 프로시저는 하위 프로세스를 생성하고 해당 하위 프로세스에 WAKEUP.COM을 입력 명령 파일로 사용하도록 지시합니다. /NOWAIT 한정자를 사용하면 하위 프로세스가 WAKEUP.COM으로부터 명령을 실행하는 동안에도 터미널에서 계속 작업할 수 있습니다. WAKEUP.COM은 터미널에 메시지를 표시합니다.
기본적으로 SPAWN 명령은 하위 프로세스에 글로벌 및 로컬 기호를 전달합니다. 따라서, REMINDER.COM에 기호 WAIT_TIME 및 MESSAGE_TEXT에 대한 값을 제공하더라도 WAKEUP.COM은 이들 기호에 액세스할 수 있습니다.
[7] 프로시저는 종료되기 전에 원본 확인 설정을 복원합니다.
REMINDER.COM 명령 프로시저 보기 실행
$ @REMINDER
Enter time to send reminder (hh:mm):12:00
Enter message:TIME FOR LUNCH
%DCL-S-SPAWNED, process BLUTO_1 spawned
$
.
.
.
TIME FOR LUNCH
11-DEC-1999 12:00:56.99
이 프로시저는 시간 값과 메시지를 묻는 프롬프트를 표시한 다음, 메시지를 표시하는 하위 프로세스를 생성합니다. 터미널에서 작업을 계속할 수 있습니다. 지정된 시간에 하위 프로세스는 터미널 벨을 울리고 메시지와 시간을 표시합니다.
DIR.COM 명령 프로시저
이 명령 프로시저는 DCL 명령 DIRECTORY/SIZE=ALL/DATE를 모방하여 지정된 파일의 (사용 및 할당된) 블록 크기와 작성 날짜를 표시합니다. 또한, F$PARSE, F$SEARCH, F$FILE_ATTRIBUTES 및 F$FAO 렉시칼 함수 사용을 보여 줍니다.
보기: DIR.COM
$ !
$ ! Command procedure implementation of DIRECTORY/SIZE=ALL/DATE
$ ! command
$ !
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ !
$ ! Replace any blank field of the P1 file specification with
$ ! a wildcard character
$ !
$ P1 = F$PARSE(P1,"*.*;*") [1]
$ !
$ ! Define initial values for symbols
$ !
$ FIRST_TIME = "TRUE"
$ FILE_COUNT = 0
$ TOTAL_ALLOC = 0
$ TOTAL_USED = 0
$
$ LOOP: [2]
$ FILESPEC = F$SEARCH(P1)
$ ! Find next file in directory
$ IF FILESPEC .EQS. "" THEN GOTO DONE
$ ! If no more files, then done
$ IF .NOT. FIRST_TIME THEN GOTO SHOW_FILE
$ ! Print header only once
$ !
$ ! Construct and output the header line
$ !
$ FIRST_TIME = "FALSE" [3]
$ DIRSPEC = F$PARSE(FILESPEC,,, "DEVICE") -
+F$PARSE(FILESPEC,,, "DIRECTORY")
$ WRITE SYS$OUTPUT ""
$ WRITE SYS$OUTPUT "Directory ",DIRSPEC
$ WRITE SYS$OUTPUT ""
$ LASTDIR = DIRSPEC $
$ !
$ ! Put the file name together, get some of the file attributes, and
$ ! type the information out
$ !
$ SHOW_FILE:
$ FILE_COUNT = FILE_COUNT + 1
$ FILENAME = F$PARSE(FILESPEC,,, "NAME") - [4]
+ F$PARSE(FILESPEC,,, "TYPE") -
+ F$PARSE(FILESPEC,,, "VERSION")
$ ALLOC = F$FILE_ATTRIBUTES(FILESPEC, "ALQ")
$ USED = F$FILE_ATTRIBUTES(FILESPEC, "EOF")
$ TOTAL_ALLOC = TOTAL_ALLOC + ALLOC
$ TOTAL_USED = TOTAL_USED + USED
$ REVISED = F$FILE_ATTRIBUTES(FILESPEC,"RDT")
$ LINE = F$FAO("!19AS !5UL/!5!> !17AS",FILENAME,-
USED, ALLOC, REVISED)
$ WRITE SYS$OUTPUT LINE
$ GOTO LOOP
$
$ !
$ ! Output summary information, reset verification, and exit
$ !
$ DONE:
$ WRITE SYS$OUTPUT "" [5]
$ WRITE SYS$OUTPUT "Total of ''FILE_COUNT' files, " + -
"''TOTAL_USED'/''TOTAL_ALLOC' blocks."
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT
DIR.COM 명령 프로시저 설명
[1] 이 프로시저는 F$PARSE 함수를 사용하여 사용자 제공 파일 지정 방법인 P1의 빈 필드에 별표를 넣습니다. DIR.COM을 실행할 때 매개 변수를 지정하지 않으면 F$PARSE 함수가 P1에 값 "*.*;*"를 할당합니다. 이 경우 DIR.COM을 실행하면 현재 기본 디렉토리의 모든 파일이 표시됩니다.
[2] F$SEARCH 렉시칼 함수는 디렉토리에서 P1이 나타내는 파일을 검색합니다. P1에 와일드카드(별표)가 포함되어 있을 경우 F$SEARCH 함수는 일치하는 모든 파일 지정 방법을 반환합니다. 마지막 파일 지정 방법이 반환된 다음 프로시저는 레이블 DONE에서 분기됩니다.
[3] 이 프로시저는 제일 처음 루프를 통과할 때 디렉토리 표시를 위한 머리글을 기록합니다. 이 머리글에는 장치 이름과 디렉토리 이름이 포함됩니다. 프로시저는 F$PARSE 함수를 사용하여 이 이름을 얻습니다.
[4] 이 프로시저는 F$PARSE 렉시칼 함수를 사용하여 디렉토리의 각 파일 지정 방법으로부터 파일 이름을 추출합니다. 그런 다음 F$FILE_ATTRIBUTES 렉시칼 함수는 각 파일에 대한 사용된 블록, 할당된 블록 및 작성 날짜 정보를 얻습니다. 마지막으로 F$FAO 함수는 디렉토리의 각 파일에 대한 단일 표시행을 서식화합니다. F$FAO 함수는 파일 이름과 파일 속성 정보를 인수로 사용합니다.
[5] F$SEARCH가 null 문자열을 반환하면 프로시저가 레이블 DONE에서 분기되고 총 파일 수, 사용된 총 블록 수, 디렉토리에 할당된 총 블록 수 등을 표시합니다.
DIR.COM 명령 프로시저 보기 실행
$ @DIR [VERN]*.COM
Directory DISK4:[VERN]

BATCH.COM;1 1/3 11-DEC-1999 11:43
CALC.COM;3 1/3 11-DEC-1999 11:30
CONVERT.COM;1 5/6 11-DEC-1999 15:23
.
.
.
LOGIN.COM;34 2/3 11-DEC-1999 13:17
PID.COM;7 1/3 11-DEC-1999 09:49
SCRATCH.COM;6 1/3 11-DEC-1999 11:29)

Total of 15 files, 22/48 blocks.
이 프로시저는 디렉토리 [VERN]에 있는 모든 .COM 파일에 대한 정보를 반환합니다.
SYS.COM 명령 프로시저
이 명령 프로시저는 현재 프로세스, 그룹 내의 모든 프로세스(현재 프로세스에 group 권한이 있을 경우) 및 시스템 내의 모든 프로세스(현재 프로세스에 world 권한이 있는 경우)에 대한 통계를 반환합니다. 이 프로시저에서는 F$PID, F$EXTRACT 및 F$GETJPI 렉시칼 함수의 사용 방법을 보여 줍니다.
보기: SYS.COM
$ !
$ ! Displays information about owner, group, or system processes.
$ !
$ ! Turn off verification and save current settings
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ CONTEXT = "" ! Initialize PID search context [1]
$ !
$ ! Output header line.
$ !
$ WRITE SYS$OUTPUT " PID Username Term Process " + - [2]
"name State Pri Image"
$ !
$ ! Output process information.
$ !
$LOOP:
$ !
$ ! Get next PID. If null, then done.
$ !
$ PID = F$PID(CONTEXT) [3]
$ IF PID .EQS. "" THEN GOTO DONE
$ !
$ ! Get image file specification and extract the file name.
$ !
$ IMAGNAME = F$GETJPI(PID,"IMAGNAME") [4]
$ IMAGNAME = F$PARSE(IMAGNAME,,,"NAME","SYNTAX_ONLY")

$ !
$ ! Get terminal name. If none, then describe type of process.
$ !
$ TERMINAL = F$GETJPI(PID,"TERMINAL") [5]
$ IF TERMINAL .EQS. "" THEN -
TERMINAL = "-"+F$EXTRACT(0,3,F$GETJPI(PID,"MODE") )+"-"
$ IF TERMINAL .EQS. "-INT-" THEN TERMINAL = "-DET-"
$ IF F$GETJPI(PID,"OWNER") .NE. 0 THEN TERMINAL = "-SUB-"
$ !
$ ! Get more information, put process line together,
$ ! and output it.
$ !
$ LINE = F$FAO("!AS !12AS !7AS !15AS !5AS !2UL/!UL !10AS", -[6]
PID,F$GETJPI(PID,"USERNAME"),TERMINAL,-
F$GETJPI(PID,"PRCNAM"),-
F$GETJPI(PID,"STATE"),F$GETJPI(PID,"PRI"),-
F$GETJPI(PID,"PRIB"),IMAGNAME)
$ WRITE SYS$OUTPUT LINE
$ GOTO LOOP

$ !
$ ! Restore verification and exit.
$ ! $DONE:
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT
SYS.COM 명령 프로시저 설명
[1] 기호 CONTEXT는 null 값으로 초기화됩니다. 이 기호는 F$PID 함수와 함께 사용되어 프로세스 ID 번호 목록을 구합니다.
[2] 이 프로시저는 표시할 머리글을 작성합니다.
[3] 이 프로시저는 첫 번째 프로세스 ID(PID) 번호를 가져옵니다. 현재 프로세스에 group 또는 world 권한이 부족할 경우 현재 프로세스의 PID 번호가 반환됩니다. 현재 프로세스에 group 권한이 있을 경우 그룹 목록의 첫 번째 PID 번호가 반환됩니다. 현재 프로세스에 world 권한이 있을 경우 시스템 목록의 첫 번째 PID 번호가 반환됩니다. 이 함수는 마지막 PID 번호가 반환될 때까지 순차적으로 다음 PID 번호를 반환합니다. 이 지점에서 null 문자열이 반환되고 프로시저가 끝으로 분기됩니다.
[4] 이 프로시저는 F$GETJPI 렉시칼 함수를 사용하여 각 PID 번호에 대한 이미지 파일 지정 방법을 가져옵니다. F$PARSE 함수는 F$GETJPI 함수에 의해 반환되는 지정 방법으로부터 파일 이름을 추출합니다.
[5] 이 프로시저는 F$GETJPI 함수를 사용하여 각 PID 번호에 대한 터미널 이름을 가져옵니다. F$EXTRACT 함수는 F$GETJPI(PID,MODE”)에 의해 반환되는 MODE 지정 방법의 처음 세 문자를 추출하여 프로세스 유형을 결정합니다. F$GETJPI 함수를 다시 사용하여 프로세스가 하위 프로세스인지 여부를 결정합니다.
[6] 이 프로시저는 F$GETJPI 렉시칼 함수를 사용하여 반환된 각 PID 번호에 대한 사용자 이름, 프로세스 이름, 프로세스 상태, 프로세스 우선 순위, 프로세스 기본 우선 순위 등을 가져옵니다. F$FAO 렉시칼 함수는 이 정보를 화면 표시로 서식화합니다.
SYS.COM 명령 프로시저 보기 실행
$ @SYS
PID Username Term Process name State Pri Image
00050011 NETNONPRIV -NET- MAIL_14411 LEF 9/4 MAIL
00040013 STOVE RTA6: STOVE LEF 9/4
00140015 MAROT -DET- DMFB0ACP HIB 9/8 F11BAC
00080016 THOMPSON -DET- MTA0ACP HIB 12/8 MTAAACP
00070017 JUHLES TTF1: JUHLES LEF 9/4
.
.
.
00040018 MARCO TTA2: MARCO HIB 9/4 RTPAD
0018001A VERN RTA3: VERN LEF 9/4
0033001B YISHA RTA7: YISHA CUR 4/4
0002004A SYSTEM -DET- ERRFMT HIB 12/7 ERRFMT
이 프로시저는 시스템에 있는 모든 프로세스에 대한 정보를 반환합니다. 현재 프로세스에 world 권한이 있습니다.
GETPARMS.COM 명령 프로시저
이 명령 프로시저는 프로시저에 전달된 매개 변수 개수를 반환합니다. 다른 프로시저에서 GETPARMS.COM을 호출하여 호출 프로시저에 전달된 매개 변수 수를 확인할 수 있습니다.
보기: GETPARMS.COM
$ ! Procedure to count the number of parameters passed to a command
$ ! procedure. This number is returned as the global symbol PARMCOUNT.

$ !
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") [1]
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ ! $ IF P1 .EQS. "?" THEN GOTO TELL [2]
$ !
$ ! Loop to count the number of parameters passed. Null parameters are
$ ! counted until the last non-null parameter is passed.
$ !
$ COUNT = 0 [3]
$ LASTNONNULL = 0
$ LOOP:
$ IF COUNT .EQ. 8 THEN GOTO END_COUNT
$ COUNT = COUNT + 1
$ IF P'COUNT' .NES. "" THEN LASTNONNULL = COUNT
$ GOTO LOOP
$ !
$ END_COUNT: [4]
$ !
$ ! Place the number of non-null parameters passed into PARMCOUNT.
$ !
$ PARMCOUNT == LASTNONNULL
$ !
$ ! Restore verification setting, if it was on, before exiting
$ ! [5]
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT
$ !
$ TELL: [6]
$ TYPE SYS$INPUT
This procedure counts the number of parameters passed to
another procedure. This procedure can be called by entering
the following string in any procedure:

@GETPARMS 'P1 'P2 'P3 'P4 'P5 'P6 'P7 'P8

On return, the global symbol PARMCOUNT
contains the number of parameters passed to the procedure.
$ !
$ EXIT
GETPARMS.COM 명령 프로시저 설명
[1] 이 프로시저는 확인 기능을 끄기 전에 현재 이미지 및 프로시저 확인 설정을 저장합니다.
[2] 물음표 문자가 프로시저에 매개 변수로 전달된 경우 프로시저는 레이블 TELL에서 분기됩니다(설명 6 참조).
[3] 프로시저에 전달된 매개 변수의 수를 계산하도록 루프가 설정되어 있습니다. 카운터 COUNT 및 LASTNONNULL은 루프로 들어가기 전에 0으로 초기화됩니다. 루프 내에서 COUNT는 값 8까지 증가되고 테스트됩니다. COUNT가 8이면 최대 매개 변수 개수가 입력된 것입니다. null이 아닌 매개 변수가 전달될 때마다 LASTNONNULL이 해당 매개 변수의 번호와 일치됩니다.
IF 명령이 실행될 때마다 기호 COUNT의 값이 달라집니다. 처음 실행될 때는 COUNT 값이 1이고 IF 명령이 P1을 검사합니다. 두 번째 실행될 때는 P2를 검사합니다. 세 번째는 P3를 네 번째는 P4의 순으로 검사합니다.
[4] 매개 변수 개수가 8에 도달하면 프로시저가 END_COUNT에서 분기됩니다. 기호 LASTNONNULL에는 전달된 null이 아닌 마지막 매개 변수의 개수가 포함됩니다. 이 값은 글로벌 기호 PARMCOUNT에 포함됩니다. PARMCOUNT를 글로벌 기호로 정의해야 이 매개 변수의 값을 호출 명령 수준에서 테스트할 수 있습니다.
[5] 원본 확인 설정이 복원됩니다.
[6] 레이블 TELL에서 TYPE 명령은 입력 스트림에 포함되는 데이터를 표시합니다. 명령 프로시저에서 입력 스트림은 명령 프로시저 파일입니다. TYPE 명령은 GETPARMS.COM 사용 방법에 대한 지침을 표시합니다.
GETPARMS.COM 명령 프로시저 보기 실행
프로시저 SORTFILES.COM에서는 사용자가 null이 아닌 세 매개 변수를 전달해야 합니다. SORTFILES.COM 프로시저에는 다음과 같은 행이 포함될 수 있습니다.
$ @GETPARMS 'P1' 'P2' 'P3' 'P4' 'P5' 'P6' 'P7' 'P8'
$ IF PARMCOUNT .NE. 3 THEN GOTO NOT_ENOUGH
.
.
.
$NOT_ENOUGH:
$ WRITE SYS$OUTPUT -
"Three non-null parameters required. Type SORTFILES HELP for info."
$
EXIT 프로시저 SORTFILES.COM은 다음과 같이 호출될 수 있습니다.
$ @SORTFILES DEF 4
Three non-null parameters required. Type SORTFILE HELP for info.
이 프로시저를 올바르게 호출하려면(즉, SORTFILES에 전달되는 매개 변수가 GETPARMS에 그대로 전달되어 처리되게 하려면) 기호 P1에서 P8까지가 단일 물음표로 묶여 있어야 합니다. GETPARMS의 반환 값이 3이 아닐 경우 SORTFILES는 오류 메시지를 출력하고 종료됩니다.
EDITALL.COM 명령 프로시저
이 명령 프로시저는 EDT 편집기를 반복적으로 호출하여 파일 그룹을 동일한 파일 유형으로 편집합니다. 이 프로시저에서는 렉시칼 함수를 사용하여 칼럼 형식 출력으로부터 파일 이름을 추출하는 방법을 보여 줍니다. 또한, 명령 프로시저 내에서 호출되는 프로그램에 대한 입력 스트림을 재정의하는 방법을 설명합니다.
보기: EDITALL.COM
$ ! Procedure to edit all files in a directory with a
$ ! specified file type. Use P1 to indicate the file type.
$ !
$ ON CONTROL_Y THEN GOTO DONE ! Ctrl/Y action [1]
$ ON ERROR THEN GOTO DONE
$ !
$ ! Check for file type parameter. If one was entered, continue;
$ ! otherwise, prompt for a parameter.
$ !
$ IF P1 .NES. "" THEN GOTO OKAY [2]
$ INQUIRE P1 "Enter file type of files to edit"
$ !
$ ! List all files with the specified file type and write the DIRECTORY
$ ! output to a file named DIRECT.OUT
$ !
$ OKAY:
$ DIRECTORY/VERSIONS=1/COLUMNS=1 - [3]
/NODATE/NOSIZE -
/NOHEADING/NOTRAILING -
/OUTPUT=DIRECT.OUT *.'P1'
$ IF .NOT. $STATUS THEN GOTO ERROR_SEC [4]
$ !
$ OPEN/READ/ERROR=ERROR_SEC DIRFILE DIRECT.OUT [5]
$ !
$ ! Loop to read directory file
$ !
$ NEWLINE: [6]
$ READ/END=DONE DIRFILE NAME
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND: ! Redefine SYS$INPUT
$ EDIT 'NAME' ! Edit the file
$ GOTO NEWLINE
$ !
$ DONE: [7]
$ CLOSE DIRFILE/ERROR=NOTOPEN ! Close the file
$ NOTOPEN:
$ DELETE DIRECT.OUT;* ! Delete temp file
$ EXIT
$ !
$ ERROR_SEC:
$ WRITE SYS$OUTPUT "Error: ",F$MESSAGE($STATUS)
$ DELETE DIRECT.OUT;*
$ EXIT
EDITALL.COM 명령 프로시저 설명
[1] ON 명령은 이 프로시저에 대한 처리 조건을 설정합니다. 이 프로시저를 실행하는 동안에 Ctrl/Y를 누르면 프로시저가 레이블 DONE에서 분기됩니다. 오류 또는 심각한 오류가 발생할 경우에도 프로시저가 레이블 DONE에서 분기됩니다.
[2] 이 프로시저는 매개 변수가 입력되었는지 여부를 검사합니다. 매개 변수가 입력되지 않은 경우 프로시저는 파일 형식을 묻는 프롬프트를 표시합니다.
[3] DIRECTORY 명령은 파일 형식이 P1으로 지정된 모든 파일을 나열합니다. 명령 입력은 DIRECT.OUT에 기록됩니다. /VERSIONS=1 한정자는 각 파일의 최상위 버전만 나열합니다. /NOHEADING 및 /NOTRAILING 한정자는 출력에 제목행 또는 디렉토리 요약을 포함하지 않습니다. /COLUMNS=1 한정자는 레코드마다 파일 이름을 하나씩 지정합니다.
[4] IF 명령은 DIRECTORY 명령이 $STATUS 값을 테스트하여 반환되는 값을 검사합니다. DIRECTORY 명령이 성공적으로 완료되지 않으면 $STATUS는 정수 값만 갖고 프로시저가 레이블 ERROR_SEC에서 분기됩니다.
[5] OPEN 명령은 디렉토리 출력 파일을 열고 해당 파일에 논리 이름 DIRFILE을 지정합니다.
[6] READ 명령은 DIRECTORY 명령 출력에서 기호 이름 NAME으로 한 행씩 읽습니다. 각 행을 읽은 후 프로시저는 DEFINE 명령을 사용하여 편집 세션에 대한 입력 스트림(SYS$INPUT)이 터미널이 되도록 재정의합니다. 그런 다음 기호 NAME을 파일 지정 방법으로 지정하여 편집기를 호출합니다. 편집 세션이 완료되면 명령 인터프리터가 명령 프로시저의 다음 행을 읽고 레이블 NEWLINE에서 분기됩니다. 프로시저가 디렉토리에서 지정된 파일 형식을 갖는 파일을 모두 편집하면 레이블 DONE에서 분기됩니다.
[7] 레이블 DONE은 READ 명령에 대한 /END 한정자의 대상 레이블이고 프로시저 시작시 설정한 ON CONTROL_Y 및 ON ERROR 조건에 대한 대상 레이블입니다. 이 레이블에서 프로시저는 필요한 정리 작업을 수행합니다.
CLOSE 명령은 DIRECTORY 명령 출력 파일을 닫고 /ERROR 한정자는 파일에서 그 다음 행에 대한 레이블을 지정합니다. /ERROR를 사용하면 디렉토리 파일이 열리지 않는 경우 표시되는 오류 메시지를 무시합니다. 예를 들어, 디렉토리 파일이 열리기 전에 Ctrl/Y를 누를 경우 이 오류 메시지가 발생됩니다.
정리의 두 번째 단계에서는 임시 디렉토리 파일을 삭제합니다.
EDITALL.COM 명령 프로시저 보기 실행
$ @EDITALL DAT
* .
.
.
%DELETE-I-FILDEL, device:[directory]DIRECT.OUT;1 deleted (x blocks)
프로시저 EDITALL은 P1을 .DAT로 지정하여 호출됩니다. 이 프로시저는 파일 형식이 .DAT인 기본 디렉토리에 있는 모든 파일의 디렉토리 목록을 작성하고 각 파일을 편집할 편집기를 호출합니다. 파일 형식이 .DAT인 마지막 파일이 편집되면 프로시저는 임시 파일 DIRECT.OUT을 삭제하고 터미널에 정보 메시지를 표시합니다.
MAILEDIT.COM 명령 프로시저
이 명령 프로시저는 Mail 유틸리티에서 텍스트 편집기를 호출합니다.
보기: MAILEDIT.COM
$ ! Command procedure to invoke an editor for Mail.
$ !
$ ! Inputs:
$ !
$ ! P1 = Input file name.
$ ! P2 = Output file name.
$ !
$ ! If MAIL$EDIT is undefined, Mail will invoke the user's selected
$ ! callable editor set by the mail SET EDITOR command.
$ !
$ ! If MAIL$EDIT is defined to be a command procedure, Mail will create
$ ! a subprocess to edit the mail, but any SET EDITOR command in Mail
$ ! will override the definition of MAIL$EDIT for the remainder of that
$ ! Mail session.
$ !
$ ! Note that this procedure is run in the context of a subprocess.
$ ! LOGIN.COM is not executed. However, all process logical names
$ ! and DCL global symbols are copied. In particular, note that the
$ ! user's individual definition of the symbol EDIT is used if there
$ ! is one. Otherwise, the system default editor is used.
$ !
$ ! The default directory is the same as the parent process
$ !
$ DEFINE /USER SYS$INPUT 'F$TRNLNM("SYS$OUTPUT")' [1]
$ IF P1 .EQS. "" THEN GOTO NOINPUT [2]
$ EDIT /OUTPUT='P2' 'P1'[3]
$ EXIT
$NOINPUT:
$ EDIT 'P2'[4]
$ EXIT
MAILEDIT.COM 명령 프로시저 설명
[1] DEFINE 명령을 사용하면 명령 파일 대신 터미널에서 편집기 입력을 가져올 수 있습니다.
[2] IF 문은 출력 파일 이름이 다른 파일의 편집과 파일 이름이 동일한 파일의 편집을 구분합니다.
[3] 이 EDIT 명령은 입력 파일 이름과 출력 파일 이름을 사용하여 편집기를 호출합니다. 이 행을 편집하여 다른 편집기를 호출할 수 있습니다. 예를 들면, 다음과 같습니다.
$ RUN XYZ_EDITOR.EXE /INPUT= 'P1' /OUTPUT='P2'
[4] 이 EDIT 명령은 단일 파일 이름을 사용하여 편집기를 호출합니다. 이 행을 편집하여 다른 편집기를 호출할 수 있습니다. 예를 들면, 다음과 같습니다.
$ RUN XYZ_EDITOR.EXE /INPUT= 'P2' /OUTPUT='P2'
MAILEDIT.COM 명령 프로시저 보기 실행
$ DEFINE MAIL$EDIT MAILEDIT.COM
$ MAIL

MAIL>SHOW EDITOR
Your editor is defined by the file MAILEDIT.COM.

FORTUSER.COM 명령 프로시저
FORTRAN 프로그램을 작성, 컴파일 및 실행하는 대화형 사용자에 대한 터미널 환경을 제어하는 시스템 정의 로그인 명령 프로시저 보기를 제공합니다. FORTUSER.COM이 로그인 명령 프로시저로 나열되는 전용 계정에 로그인한 사용자는 FORTUSER.COM에서 수락한 명령만 실행할 수 있습니다. 이 프로시저는 렉시칼 함수를 사용하여 사용자가 입력한 명령을 유효 명령 목록과 비교하여 옵션 테이블을 단계별로 처리하는 방법을 설명합니다.
보기: FORTUSER.COM
$ ! Procedure to create, compile, link, execute, and debug
$ ! FORTRAN programs. Users can enter only the commands listed
$ ! in the symbol OPTION_TABLE.
$ SET NOCONTROL=Y [1]
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ OPTION_TABLE = "EDIT/COMPILE/LINK/RUN/EXECUTE/DEBUG/PRINT/HELP/FILE/DONE/" [2]
$ TYPE SYS$INPUT [3]
VMS FORTRAN Command Interpreter

Enter name of file with which you would like to work.
$ !
$ ! Set up for initial prompt
$ !
$ PROMPT = "INIT" [4]
$ GOTO HELP ! Print the initial help message
$ !
$ ! after the first prompting message, use the prompt: Command
$ !
$ INIT:
$ PROMPT = "GET_COMMAND"
$ GOTO FILE ! Get initial file name
$ !
$ ! Main command parsing routine. The routine compares the current
$ ! command against the options in the option table. When it finds
$ ! a match, it branches to the appropriate label.
$ !
$ GET_COMMAND:
$ ON CONTROL_Y THEN GOTO GET_COMMAND ! Ctrl/Y resets prompt [5]
$ SET CONTROL=Y
$ ON WARNING THEN GOTO GET_COMMAND ! If any, reset prompt
$ INQUIRE COMMAND "Command"
$ IF COMMAND .EQS. "" THEN GOTO GET_COMMAND
$ IF F$LOCATE(COMMAND + "/", OPTION_TABLE) .EQ. F$LENGTH(OPTION_TABLE) -[6]
THEN GOTO INVALID_COMMAND
$ GOTO 'COMMAND'
$ !
$ INVALID_COMMAND: [7]
$ WRITE SYS$OUTPUT " Invalid command"
$ !
$ HELP: [8]
$ TYPE SYS$INPUT
The commands you can enter are:
FILE Name of FORTRAN program in your current
default directory. Subsequent commands
process this file.
EDIT Edit the program.
COMPILE Compile the program with FORTRAN.
LINK Link the program to produce an executable image.
RUN Run the program's executable image.
EXECUTE Same function as COMPILE, LINK, and RUN.
DEBUG Run the program under control of the debugger.
PRINT Queue the most recent listing file for printing.
DONE Return to interactive command level.
HELP Print this help message.

Enter Ctrl/Y to restart this session
$ GOTO 'PROMPT' [9]
$ EDIT: [10]
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:
$ EDIT 'FILE_NAME'.FOR
$ GOTO GET_COMMAND
$ COMPILE:
$ FORTRAN 'FILE_NAME'/LIST/OBJECT/DEBUG
$ GOTO GET_COMMAND
$ LINK:
$ LINK 'FILE_NAME'/DEBUG
$ PURGE 'FILE_NAME'.*/KEEP=2
$ GOTO GET_COMMAND
$ RUN:
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:
$ RUN/NODEBUG 'FILE_NAME'
$ GOTO GET_COMMAND
$ DEBUG:
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:
$ RUN 'FILE_NAME'
$ GOTO GET_COMMAND
$ EXECUTE:
$ FORTRAN 'FILE_NAME'/LIST/OBJECT
$ LINK/DEBUG 'FILE_NAME'
$ PURGE 'FILE_NAME'.*/KEEP=2
$ RUN/NODEBUG 'FILE_NAME'
$ GOTO GET_COMMAND
$ PRINT:
$ PRINT 'FILE_NAME'
$ GOTO GET_COMMAND
$ BADFILE: [11]
$ WRITE SYS$OUTPUT "File must be in current default directory."
$ FILE:
$ INQUIRE FILE_NAME "File name"
$ IF FILE_NAME .EQS. "" THEN GOTO FILE
$ IF F$PARSE(FILE_NAME,,,"DIRECTORY") .NES. F$DIRECTORY() - [12]
THEN GOTO BADFILE
$ FILE_NAME = F$PARSE(FILE_NAME,,,"NAME")
$ GOTO GET_COMMAND
$ DONE:
$ EXIT
FORTUSER.COM 명령 프로시저 설명
[1] SET NOCONTROL=Y 명령은 이 프로시저의 통제에 따라 로그인하는 사용자가 프로시저나 프로시저의 명령 또는 프로그램을 중단하지 못하게 합니다.
[2] 옵션 테이블에는 사용자가 실행할 수 있는 명령이 나열됩니다. 각 명령은 슬래시로 분리됩니다.
[3] 이 프로시저는 자동으로 소개됩니다.
[4] 기호 이름 PROMPT에는 프로시저의 레이블 값이 지정됩니다. 프로시저가 처음 호출될 때 이 기호는 값 INIT를 갖습니다. HELP 명령 텍스트는 레이블 PROMPT를 지정하는 GOTO 명령으로 종료됩니다. 이 텍스트가 처음으로 표시되면 GOTO 명령이 레이블 HELP에서 분기됩니다. 그러면 사용자가 입력할 수 있는 명령을 설명하는 HELP 메시지가 표시됩니다. 그런 다음 프로시저가 레이블 INIT에서 다시 분기되어 PROMPT 값이 GET_COMMAND”로 변경됩니다. 마지막으로 프로시저가 레이블 FILE에서 분기되어 파일 이름을 가져옵니다. 따라서, 도움말 텍스트가 표시되면 프로시저가 레이블 GET_COMMAND에서 분기되어 다음 명령을 가져옵니다.
[5] Ctrl/Y 조건 동작은 경고 조건 동작처럼 레이블 GET_COMMAND로 복귀하도록 설정됩니다. 프로시저는 명령을 묻는 프롬프트를 표시하고 아무것도 입력하지 않더라도 프롬프트를 계속해서 표시합니다. 세션을 종료하고 대화형 명령 수준으로 복귀하려면 명령 DONE을 입력합니다.
[6] 이 프로시저는 F$LOCATE 및 F$LENGTH 렉시칼 함수를 사용하여 명령이 옵션 목록에 포함되는지 여부를 결정합니다. F$LOCATE 함수는 슬래시 뒤에 있는 사용자 입력 명령을 검사합니다. 예를 들어, 사용자가 EDIT을 입력하면 프로시저는 EDIT/을 검사합니다. 명령이 옵션 목록에 포함되지 않을 경우 프로시저가 레이블 INVALID_COMMAND에서 분기됩니다. 명령이 유효하면 프로시저가 해당 레이블에서 분기됩니다.
[7] 레이블 INVALID_COMMAND에서 프로시저는 오류 메시지를 기록하고 유효한 명령을 나열하는 도움말 텍스트를 표시합니다.
[8] 도움말 텍스트에는 유효한 명령이 나열됩니다. 이 텍스트는 처음부터 표시되며, 사용자가 HELP 명령 또는 유효하지 않은 명령을 입력할 때마다 표시됩니다.
[9] HELP 텍스트의 마지막 부분에서 GOTO 명령은 기호 이름 PROMPT를 지정합니다. 이 프로시저가 처음 호출될 때 기호는 값 INIT를 가지고, 그 이후에는 값 GET_COMMAND를 가집니다.
[10] 목록에 있는 각 유효 명령은 옵션 테이블에 해당 엔트리가 있고 명령 프로시저에 해당 레이블이 있습니다. 터미널에서 입력을 읽는 명령(예: EDIT)의 경우 프로시저는 입력 스트림을 SYS$COMMAND로 정의하는 DEFINE 명령을 포함합니다.
[11] 레이블 BADFILE에서 프로시저는 파일이 현재 디렉토리에 있어야 함을 나타내는 메시지를 표시합니다. 그런 다음 다른 파일 이름을 묻는 프롬프트를 표시합니다.
[12] 파일 이름을 입력하면 프로시저는 현재 기본 디렉토리와 다른 디렉토리를 지정하지 않았는지 확인합니다. 그런 다음 프로시저는 F$PARSE 함수를 사용하여 파일 이름을 추출합니다. 각 명령은 해당 기본 파일 형식을 제공합니다. 파일을 처리할 명령을 가져올 수 있도록 프로시저가 레이블 GET_COMMAND에서 다시 분기됩니다.
FORTUSER.COM 명령 프로시저 보기 실행
다음 보기에서는 이 명령 프로시저를 전용 명령 프로시저로 사용하는 방법을 설명합니다.
Username:CLASS30
Password:
OpenVMS Version 7.1

OpenVMS FORTRAN Command Interpreter
Enter name of file with which you would like to work.
The commands you can enter are:
FILE Name of FORTRAN program in your current
default directory. Subsequent commands
process this file.
EDIT Edit the program. COMPILE
Compile the program with VAX FORTRAN.
LINK Link the program to produce an executable image.
RUN Run the program's executable image.
EXECUTE Same function as COMPILE, LINK and RUN.
DEBUG Run the program under control of the debugger.
PRINT Queue the most recent listing file for printing.
DONE Return to interactive command level.
HELP Print this help message.

Enter Ctrl/Y to restart this session
File name: AVERAGE
Command: COMPILE
Command: LINK
Command: RUN
Command: FILE
File name: READFILE
Command: EDIT
이 보기 실행에서는 이름이 CLASS30인 사용자가 FORTUSER 명령 프로시저에 의해 제어되는 계정에 로그인하는 세션을 보여 줍니다. FORTUSER 명령 프로시저는 사용자가 실행할 수 있는 명령과 세션을 다시 시작하기 위한 명령을 표시합니다. 사용자가 파일 AVERAGE를 지정하고, 해당 파일을 컴파일, 링크 및 실행합니다. 그런 다음 사용자는 FILE 명령을 입력하여 다른 파일 작업을 시작합니다.
LISTER.COM 명령 프로시저
입력 데이터를 묻는 프롬프트를 표시하고, 열에 있는 데이터를 서식화한 다음 출력 파일로 정렬합니다. 이 프로시저에서는 READ 및 WRITE 명령과 할당문의 문자 하위 문자열 오버레이 서식을 보여 줍니다.
보기: LISTER.COM
$ ! Procedure to accumulate programmer names and document file names.
$ ! After all programmer names and file names are entered, they are
$ ! sorted in alphabetic order by programmer name and printed on
$ ! the system printer.
$ !
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") [1]
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ !
$ OPEN/WRITE OUTFILE DATA.TMP ! Create output file [2]
$ !
$ ! Loop to obtain programmers' last names and file names,
$ ! and write this data to DATA.TMP.
$ !
$ LOOP: [3]
$ INQUIRE NAME "Programmer (press Return to quit)"
$ IF NAME .EQS. "" THEN GOTO FINISHED
$ INQUIRE FILE "Document file name"
$ RECORD[0,20]:='NAME' [4]
$ RECORD[21,20]:='FILE'
$ WRITE OUTFILE RECORD
$ GOTO LOOP
$ FINISHED:
$ CLOSE OUTFILE
$ !
$ DEFINE/USER_MODE SYS$OUTPUT: NL: ! Suppress sort output $ SORT/KEY=(POSITION:1,SIZE=20) DATA.TMP DOC.SRT [5]
$ !
$ OPEN/WRITE OUTFILE DOCUMENT.DAT [6]
$ WRITE OUTFILE "Programmer Files as of ",F$TIME()
$ WRITE OUTFILE ""
$ RECORD[0,20]:="Programmer Name"
$ RECORD[21,20]:="File Name"
$ WRITE OUTFILE RECORD
$ WRITE OUTFILE ""
$ !
$ CLOSE OUTFILE [7]
$ APPEND DOC.SRT DOCUMENT.DAT
$ PRINT DOCUMENT.DAT

$ !
$ INQUIRE CLEAN_UP "Delete temporary files [Y,N]" [8]
$ IF CLEAN_UP THEN DELETE DATA.TMP;*,DOC.SRT;*
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE) $ EXIT
LISTER.COM 명령 프로시저 설명
[1] LISTER.COM은 현재 확인 설정을 저장하고 확인 기능을 비활성화합니다.
[2] OPEN 명령은 기록할 임시 파일을 작성합니다.
[3] INQUIRE 명령은 프로그래머 이름과 파일 이름을 묻는 프롬프트를 표시합니다. Return 키를 눌러 INQUIRE 명령 프롬프트에 대한 응답으로 null 행을 입력하면 프로시저는 더 이상의 데이터가 입력되지 않는 것으로 간주하고 레이블 FINISHED에서 분기됩니다.
[4] 기호 NAME 및 FILE에 값을 할당한 후 프로시저는 할당문의 문자열 오버레이 서식을 사용하여 기호 RECORD에 대한 값을 구성합니다. RECORD의 1열부터 21열까지에 NAME의 현재 값이 기록됩니다. 명령 인터프리터는 공백을 사용하여 NAME 값을 패딩하여 지정된 20자 길이를 채웁니다.
마찬가지로 RECORD의 다음 20열에 FILE 값이 채워집니다. 그런 다음 RECORD 값이 출력 파일에 기록됩니다.
[5] 파일이 닫힌 다음 프로시저는 출력 파일 DATA.TMP를 정렬합니다. DEFINE 명령은 null 파일 NL에 SORT 명령 출력을 지시합니다. 그렇지 않으면 다음과 같은 통계가 터미널에 표시됩니다.
처음 20열에 대해 프로그래머 이름 순으로 정렬이 수행됩니다.
정렬된 출력 파일의 이름은 DOC.SRT입니다.
[6] 이 프로시저는 OPEN 명령을 사용하여 최종 출력 파일 DOCUMENT.DAT를 작성합니다. 파일에 기록된 첫째 행은 머리글 행으로 해당 열의 머리글, 날짜와 시간, 제목 등이 제공됩니다.
[7] 프로시저는 파일 DOCUMENT.DAT를 닫고 해당 파일에 정렬된 출력 파일 DOC.SRT를 첨부합니다. 그런 다음 출력 파일을 시스템 프린터의 대기열에 등록합니다.
[8] 프로시저는 중간 파일을 삭제할지 여부를 결정하라는 프롬프트를 표시합니다. INQUIRE 명령 프롬프트에 참에 해당하는 응답(T, t, Y, y)을 입력하면 파일 DATA.TMP와 DOC.SRT가 삭제됩니다. 그렇지 않으면 해당 파일이 유지됩니다.
LISTER.COM 명령 프로시저 보기 실행
$ @LISTER
Programmer:WATERS
Document file name:CRYSTAL.CAV
Programmer:JENKINS
Document file name:MARIGOLD.DAT
Programmer:MASON
Document file name:SYSTEM.SRC
Programmer:ANDERSON
Document file name:JUNK.J
Programmer:Return
Delete temporary files [Y,N]:y
이 프로시저 실행의 결과 출력 파일에는 다음이 포함됩니다.
Programmer Files as of 31-DEC-1999 16:18:58.79

Programmer Name File Name

ANDERSON JUNK.J
JENKINS MARIGOLD.DAT
MASON SYSTEM.SRC
WATERS CRYSTAL.CAV
CALC.COM 명령 프로시저
산술 계산을 수행하고 결과 값을 16진수 및 10진수 값으로 변환합니다.
보기: CALC.COM
$ ! Procedure to calculate expressions. If you enter an
$ ! assignment statement, then CALC.COM evaluates the expression
$ ! and assigns the result to the symbol you specify. In the next
$ ! iteration, you can use either your symbol or the symbol Q to
$ ! represent the current result.
$ !
$ ! If you enter an expression, then CALC.COM evaluates the
$ ! expression and assigns the result to the symbol Q. In
$ ! the next iteration, you can use the symbol Q to represent
$ ! the current result.
$ !
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ START:
$ ON WARNING THEN GOTO START [1]
$ INQUIRE STRING "Calc" [2]
$ IF STRING .EQS. "" THEN GOTO CLEAN_UP
$ IF F$LOCATE("=",STRING) .EQ. F$LENGTH(STRING) THEN GOTO EXPRESSION
$ !
$ ! Execute if string is in the form symbol = expression
$ STATEMENT: [3]
$ 'STRING' ! Execute assignment statements
$ SYMBOL = F$EXTRACT(0,F$LOCATE("=",STRING)-1,STRING) ! get symbol name
$ Q = 'SYMBOL' ! Set up q for future iterations
$ LINE = F$FAO("Decimal = !SL Hex = !-!XL Octal = !-!OL",Q)
$ WRITE SYS$OUTPUT LINE
$ GOTO START
$ !
$ !
$ ! Execute if string is an expression
$ EXPRESSION: [4]
$ Q = F$INTEGER('STRING') ! Can use Q in next iteration
$ LINE = F$FAO("Decimal = !SL Hex = !-!XL Octal = !-!OL",Q)
$ WRITE SYS$OUTPUT LINE
$ GOTO START
$ !
$ CLEAN_UP:
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT
CALC.COM 명령 프로시저 참고
[1] 이 프로시저는 프로시저를 다시 시작하는 오류 처리 조건을 설정합니다. 심각도가 높은 오류 또는 경고가 발생하면 프로시저가 시작 부분에서 분기되어 ON 조건을 초기화합니다.
이 기술은 사용자가 식을 잘못 입력하더라도 프로시저가 종료되지 않게 합니다.
[2] INQUIRE 명령은 산술식을 묻는 프롬프트를 표시합니다. 프로시저는 다음과 같은 형식으로 식을 적용합니다.
name = expression
expression
Return 키를 누르면 프로시저는 CALC 세션이 끝난 것으로 간주하고 종료합니다.
"name = expression" 형식으로 입력하면 프로시저가 레이블 STATEMENT에서 계속 실행됩니다. 그렇지 않으면 프로시저가 레이블 EXPRESSION에서 분기됩니다.
[3] 프로시저는 할당문을 실행하고 식의 결과를 기호로 지정합니다. 그런 다음 기호 이름을 추출하고 기호 값을 Q로 지정합니다. 이렇게 하면 다음에 프로시저를 반복하는 동안 Q 또는 기호를 사용할 수 있습니다. 그런 다음 결과를 표시하고 레이블 START에서 다시 분기됩니다.
[4] 프로시저는 식을 평가하고 결과를 기호 Q로 지정합니다. 이렇게 하면 다음에 프로시저를 반복하는 동안 Q를 사용할 수 있습니다. 그런 다음 결과를 표시하고 레이블 START에서 다시 분기됩니다.
CALC.COM 명령 프로시저 보기 실행
$ @CALC
Calc:2 * 30
Decimal = 60 Hex = 0000003C Octal = 00000000074
Calc:Q + 3 Decimal = 63 Hex = 0000003F Octal = 00000000077
Calc:TOTAL = Q + 4 Decimal = 67 Hex = 00000043 Octal = 00000000103
Calc:5 + 7

Decimal = 12 Hex = 0000000C Octal = 00000000014
Calc:
Return
$

프로시저에서 각 프롬프트 다음에 사용자는 산술식을 입력합니다. 이 프로시저는 결과를 10진수, 16진수 및 8진수로 표시합니다. 데이터가 없는 행에서 Return 키를 눌러 null 행을 지정하면 CALC 세션이 끝납니다.
BATCH.COM 명령 프로시저
명령 문자열, 명령 프로시저 또는 명령 목록을 적용한 다음 해당 명령을 일괄 처리 작업으로 실행합니다.
보기: BATCH.COM
$ VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ VERIFY_PROCEDURE = F$VERIFY(0)
$!
$! Turn off verification and save current settings.
$! (This comment must appear after you turn verification
$! off; otherwise it will appear in the batch job log file.)
$!
$!
$! If this is being executed as a batch job,
$! (from the SUBMIT section below) go to the EXECUTE_BATCH_JOB section
$! Otherwise, get the information you need to prepare to execute the
$! batch job.
$!
$ IF F$MODE() .EQS. "BATCH" THEN GOTO EXECUTE_BATCH_JOB [1]
$!
$!
$! Prepare to submit a command (or a command procedure) as a batch job.
$! First, determine a mnemonic process name for the batch job. Use the
$! following rules:
$!
$! 1) If the user is executing a single command, then use the verb name.
$! Strip off any qualifiers that were included with the command.
$! 2) If the user is executing a command procedure, then use the file name. $! 3) Otherwise, use BATCH.
$!
$ JOB_NAME = P1 [2]
$ IF JOB_NAME .EQS. "" THEN JOB_NAME = "BATCH"
$ IF F$EXTRACT(0,1,JOB_NAME) .EQS. "@" THEN JOB_NAME = F$EXTRACT(1,999,JOB_NAME)
$ JOB_NAME = F$EXTRACT(0,F$LOCATE("/",JOB_NAME),JOB_NAME)
$ JOB_NAME = F$PARSE(JOB_NAME,,,"NAME","SYNTAX_ONLY")
$ IF JOB_NAME .EQS. "" THEN JOB_NAME = "BATCH"
$!
$!
$! Get the current default device and directory.
$!
$ ORIGDIR = F$ENVIRONMENT("DEFAULT")
$!
$!
$! Concatenate the parameters to form the command string to be executed.
$! If the user did not enter a command string, the symbol COMMAND will have
$! a null value.
$!
$ COMMAND = P1 + " " + P2 + " " + P3 + " " + P4 + " " + - [3]
P5 + " " + P6 + " " + P7 + " " + P8 $!
$!
$! If the user is executing a single command and if both the command and the
$! original directory specification are small enough to be passed as
$! parameters to the SUBMIT command, then submit the batch job now.
$!
$ IF (P1 .NES. "") .AND. (F$LENGTH(COMMAND) .LE. 255) .AND. - [4]
(F$LENGTH(ORIGDIR) .LE. 255) THEN GOTO SUBMIT
$!
$!
$! If the single command to be executed in the batch job is very large, or
$! if you have to prompt for commands to execute in the batch job, then
$! create a temporary command procedure to hold those commands and get the
$! fully expanded name of the command procedure.
$!
$ CREATE_TEMP_FILE:
$ ON CONTROL_Y THEN GOTO CONTROL_Y_HANDLER [5]
$ OPEN/WRITE/ERROR=FILE_OPEN_ERROR TEMPFILE SYS$SCRATCH:'JOB_NAME'.TMP [6]
$ FILESPEC = F$SEARCH("SYS$SCRATCH:" + JOB_NAME + ".TMP")
$!
$! By default, have the batch job continue if it encounters any errors.
$!
$ WRITE TEMPFILE "$ SET NOON"
$!
$! Either write the single large command to the file, or prompt for
$! multiple commands and write them to the file.
$!
$ IF COMMAND .NES. " " THEN GOTO WRITE_LARGE_COMMAND
$
$ LOOP:
$ READ /END_OF_FILE=CLOSE_FILE /PROMPT="Command: " SYS$COMMAND COMMAND
$ IF COMMAND .EQS. "" THEN GOTO CLOSE_FILE
$ WRITE TEMPFILE "$ ",COMMAND
$ GOTO LOOP
$
$ WRITE_LARGE_COMMAND:
$ WRITE TEMPFILE "$ ",COMMAND
$
$!
$! Finish the temporary file by defining a symbol so that you will know
$! the name of the command procedure to delete and then close the file.
$! Define the symbol COMMAND to mean "execute the command procedure
$! you have just created." Then submit the batch job and execute
$! this command procedure in the batch job.
$!
$ CLOSE_FILE: [7]
$ WRITE TEMPFILE "$ BATCH$DELETE_FILESPEC == """,FILESPEC,""""
$ CLOSE TEMPFILE
$ ON CONTROL_Y THEN EXIT
$ COMMAND = "@" + FILESPEC
$!
$!
$! Submit BATCH.COM as a batch job, and pass it two parameters.
$! P1 is the command (or name of the command procedure) to execute.
$! P2 is the directory from which to execute the command.
$!
$ SUBMIT: [8]
$ SUBMIT/NOTIFY/NOPRINT 'F$ENVIRONMENT("PROCEDURE")' /NAME='JOB_NAME' - /PARAMETERS=("''COMMAND'","''ORIGDIR'")
$ GOTO EXIT
$!
$!
$! The user pressed Ctrl/Y while the temporary command procedure was open.
$! Close the command procedure, delete it if it exists, and exit.
$!
$ CONTROL_Y_HANDLER: [9]
$ CLOSE TEMPFILE
$ IF F$TYPE(FILESPEC) .NES. "" THEN DELETE/NOLOG 'FILESPEC'
$ WRITE SYS$OUTPUT "Ctrl/Y caused the command procedure to abort."
$ GOTO EXIT
$!
$!
$! The temporary command procedure could not be created.
$! Notify the user and exit.
$!
$ FILE_OPEN_ERROR: [10]
$ WRITE SYS$OUTPUT "Could not create sys$scratch:",job_name,".tmp"
$ WRITE SYS$OUTPUT "Please correct the situation and try again."
$!
$!
$! Restore the verification states and exit. $!
$ EXIT: [11]
$ VERIFY_PROCEDURE = F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE)
$ EXIT
$!
$!
$! BATCH.COM was invoked as a batch job. P1 contains the command
$! to execute and P2 the default directory specification.
$! Return a status code that indicates the termination status of P1.
$!
$ EXECUTE_BATCH_JOB: [12]
$ SET NOON
$ VERIFY_PROCEDURE = F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE)
$ SET DEFAULT 'P2'
$ 'P1'
$ IF F$TYPE(BATCH$DELETE_FILESPEC) .EQS. "" THEN EXIT $STATUS
$ STATUS = $STATUS
$ DELETE /NOLOG 'BATCH$DELETE_FILESPEC'
$ EXIT STATUS
BATCH.COM 명령 프로시저 설명
[1] 이 IF 문은 BATCH.COM이 일괄 처리 모드에서 실행 중인지 여부를 테스트합니다. BATCH.COM을 대화형으로 호출할 경우 일괄 처리 작업으로 실행할 명령 프로시저 또는 명령 문자열을 매개 변수로 제공합니다. 매개 변수를 제공하지 않으면 BATCH.COM은 명령을 묻는 프롬프트를 표시하고, 파일에 이 명령을 기록한 다음 이 명령 프로시저를 일괄 처리 작업으로 실행합니다. BATCH.COM은 일괄 처리 작업에서 실행할 명령을 준비한 다음 SUBMIT 명령을 사용하여 일괄 처리 작업으로 실행하고 이 작업에서 명령을 실행합니다(설명 8 참조). BATCH.COM을 일괄 처리 작업으로 호출하면 프로시저가 레이블 EXECUTE_BATCH_JOB에서 분기됩니다. BATCH.COM을 일괄 처리 모드에서 실행할 경우 실행할 명령 또는 명령 프로시저를 P1으로 지정하고 기본 디렉토리를 P2로 지정해야 합니다.
[2] 이 명령은 일괄 처리 작업을 실행과 비교합니다. 먼저, 프로시저는 일괄 처리 작업에 대한 이름을 구성합니다. 명령 문자열이 전달되면 BATCH.COM은 동사 이름을 작업 이름으로 사용합니다. 명령 프로시저가 전달되면 BATCH.COM은 파일 이름을 사용합니다. 입력이 전달되지 않으면 BATCH.COM은 작업 이름을 BATCH로 지정합니다.
[3] 매개 변수를 연결하여 실행할 명령 문자열을 형성합니다. 명령 문자열은 기호 COMMAND로 지정됩니다.
[4] SUBMIT 명령은 255자를 초과하는 매개 변수를 전달할 수 없습니다. 따라서, 이 프로시저는 명령 문자열과 디렉토리 이름이 255자를 넘지 않는지 테스트하여, 명령 문자열과 디렉토리 이름이 모두 255자를 넘지 않고 사용자가 명령 문자열을 전달한 경우 레이블 SUBMIT에서 분기됩니다.
[5] 이 프로시저는 이 명령 프로시저 섹션을 수행하는 동안 사용자가 Ctrl/Y를 누를 경우 정리 작업이 수행되도록 Ctrl/Y 처리기를 구성합니다.
[6] 이 프로시저는 실행할 명령을 포함시킬 임시 파일을 작성합니다. 사용자가 긴 명령 문자열을 입력하면 프로시저가 WRITE_LARGE_COMMAND에서 분기되고 임시 파일에 이 명령을 기록합니다. 그렇지 않을 경우 프로시저는 실행할 명령을 묻는 프롬프트를 표시합니다. 각 명령은 임시 파일에 기록됩니다.
[7] 임시 파일을 닫기 전에 파일에 기호 할당문을 기록하십시오. 이 할당문은 임시 파일에 대한 파일 이름을 기호 BATCH$DELETE_FILESPEC으로 지정합니다. 임시 파일을 닫은 다음 프로시저는 기본 Ctrl/Y 처리기를 초기화합니다. 그런 다음 기호 COMMAND가 실행될 때 임시 명령 파일을 호출하도록 기호 COMMAND를 정의합니다.
[8] 이 프로시저는 정의된 작업 이름을 사용하여 일괄 처리 작업으로 자동 실행됩니다(설명 2 참조). 이 프로시저는 실행할 명령 또는 명령 프로시저와 명령을 실행할 디렉토리라는 두 매개 변수를 전달합니다. 그런 다음 레이블 EXIT에서 분기됩니다 (설명 11 참조).
[9] 이 섹션에서는 임시 파일이 작성되는 동안 사용자가 Ctrl/Y를 입력하면 정리 작업을 수행합니다.
[10] 이 섹션에서는 임시 파일을 작성할 수 없을 경우 오류 메시지를 기록합니다.
[11] 프로시저는 원본 확인 설정을 초기화한 다음 종료됩니다.
[12] BATCH.COM이 일괄 처리 모드에서 실행될 때 이 명령이 실행됩니다. 먼저, ON 오류 처리가 해제되고 사용자의 기본 확인 설정이 설정됩니다. 그런 다음 기본값이 P2에서 나타내는 디렉토리로 설정되고 P1에서 나타내는 명령 또는 명령 프로시저가 실행됩니다. 임시 파일이 작성된 경우 이 파일은 삭제됩니다. BATCH$DELETE_FILESPEC을 삭제하기 전에 P1의 완료 상태가 저장됩니다. 이 완료 상태는 EXIT 명령에 의해 반환됩니다.
BATCH.COM 명령 프로시저 보기 실행
$ @BATCH RUN MYPROG
Job RUN (queue SYS$BATCH, entry 1715) started on SYS$BATCH
이 보기에서는 BATCH.COM을 사용하여 일괄 처리 작업에서 프로그램을 실행합니다.
COMPILE_FILE.COM 명령 프로시저
Pascal 또는 FORTRAN으로 작성된 파일을 컴파일, 링크 및 실행합니다. 이 프로시저는 처리할 파일을 묻는 프롬프트를 표시하고 파일 형식이 .PAS인지 .FOR인지를 확인합니다. 파일 형식이 .PAS 또는 .FOR이 아니거나 현재 기본 디렉토리에 파일이 없을 경우 명령 프로시저는 해당 오류 메시지를 출력합니다. 이 프로시저에서는 IF-THEN-ELSE 언어 구조의 사용 방법을 보여 줍니다.
보기: COMPILE_FILE.COM
$! This command procedure compiles, links, and runs a file written in Pascal
$! or FORTRAN.
$!
$ ON CONTROL_Y THEN EXIT
$!
$ TOP:
$ INQUIRE FILE "File to process"
$ IF F$SEARCH(FILE) .NES. "" [1]
$ THEN
$ FILE_TYPE = F$PARSE(FILE,,,"TYPE") [2] ! determine file type
$ FILE_TYPE = F$EXTRACT(1,F$LENGTH('FILE_TYPE'),FILE_TYPE) ! remove period
$! Remove type from file specification
$ PERIOD_LOC = F$LOCATE(".",FILE)
$ FILE = F$EXTRACT(0,PERIOD_LOC,FILE)
$ ON WARNING THEN GOTO OTHER
$ GOTO 'FILE_TYPE'
$ ELSE [3]
$ WRITE SYS$OUTPUT FILE, "does not exist"
$ ENDIF [4]
$!
$ GOTO END $!
$!
$!
$ FOR: [5]
$ ON ERROR THEN GOTO PRINT
$ FORTRAN/LIST 'FILE'
$ GOTO LINK
$!
$ PAS:
$ ON ERROR THEN GOTO PRINT
$ PASCAL/LIST 'FILE'
$ GOTO LINK
$!
$ OTHER:
$ WRITE SYS$OUTPUT "Can't handle files of type .''FILE_TYPE'"
$ GOTO END
$!
$ LINK: [6]
$ ON ERROR THEN GOTO END
$ WRITE SYS$OUTPUT "Successful compilation ...."
$ LINK 'FILE'
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND
$ RUN 'FILE'
$ GOTO CLEANUP
$! $ PRINT: [7]
$ WRITE SYS$OUTPUT "Unsuccessful compilation, printing listing file ...."
$ PRINT 'FILE'
$!
$ CLEANUP:
$ DELETE 'FILE'.OBJ;
$ DELETE 'FILE'.LIS;
$!
$ END:
$ INQUIRE/NOPUNCTUATION ANS "Process another file (Y or N)? "
$ IF ANS THEN GOTO TOP
$ EXIT
COMPILE_FILE.COM 명령 프로시저 설명
[1] IF 명령은 F$SEARCH 렉시칼 함수를 사용하여 디렉토리를 검사하고 파일이 있는지 확인합니다.
[2] THEN 명령 다음의 명령 블록은 다음을 수행합니다.
F$LENGTH 렉시칼 함수를 사용하여 파일 형식의 길이 결정
파일 형식 결정
파일 형식에서 기간 제거
파일 지정 방법에서 파일 형식을 제거하여 파일 이름 결정
파일 이름에서 기간 제거
오류가 발생할 경우 수행할 작업 정의
기호 FILE_TYPE에 의해 정의된 레이블에서 분기
[3] "File to process:" 프롬프트에 입력한 파일이 디렉토리에 없으면 ELSE 명령 다음에 이 명령이 실행됩니다.
[4] ENDIF 명령은 IF-THEN-ELSE 명령 구조를 종료합니다.
[5] 프로시저는 FORTRAN 프로그램을 컴파일하고 LINK 레이블에서 분기됩니다. 컴파일하는 동안 오류가 발생하면 프로시저가 PRINT 레이블에서 분기됩니다.
[6] 이 프로시저는 올바르게 컴파일된 프로그램을 표시하고, 프로그램을 링크 및 실행한 다음 CLEANUP 레이블에서 분기됩니다. 오류가 발생하면 프로그램이 END 레이블에서 분기됩니다.
[7] 프로시저는 기본 인쇄 대기열에 프로그램 목록 파일을 입력합니다.
COMPILE_FILE.COM 명령 프로시저 보기 실행
$ @COMPILE_FILE
File to process: RAND.PAS
Successful compilation
%DELETE-I-FILDEL,WORK:[DESCH]RAND.OBJ;1 deleted (3 blocks)
%DELETE-I-FILDEL,WORK:[DESCH]RAND.LIS;1 deleted (9 blocks)

Process another file (Y or N)?
N Return

TOC PREV NEXT INDEX