Программирование DCL — удаленные соединения

Во-первых, я полный новичок, и меня нельзя подпускать к клавиатуре. Тем не менее, я пытаюсь написать файл DCL .COM, который позволит пользователю подключаться к удаленному устройству, выбрав его из списка.

Все, что я хочу сделать, это позволить им выбрать устройство и подключиться, а затем, когда они отключатся от устройства, вернуться к тому, с чего они начали. Он продолжает сбрасывать меня после того, как я завершаю удаленное соединение.

Операционная система - OpenVMS. Вот код (где xxx.xxx.xxx.xxx будет IP-адресом удаленной системы).

Любая помощь будет оценена!

$!      MRV Terminal Server Connection Menu
$!       
$ ON ERROR THEN $ LOGOUT
$ GOMENU:
$!
$ CLS:==SET TERM/WIDTH=80
$ WT:==WRITE SYS$OUTPUT
$!
$ CLS
$ WT "   MRV Terminal Server Connection Menu "
$ WT " "
$ WT "  1     MRV 1"
$ WT "  2     MRV 2"
$ WT "  3     MRV 3"
$ WT "  4     MRV 4" 
$ WT "  5     MRV 5"
$ WT "  6     MRV 6"
$ WT "  7     MRV 7"
$ WT "  8     MRV 8"
$ WT "  9     MRV 9"
$ WT "  10     MRV 10"
$ WT "  11     MRV 11"
$ WT "  12     MRV 12"
$ WT "  13     MRV 13"
$ WT "  14     MRV 14"  
$ WT " "
$ WT " "
$ WT " "
$ WT " "
$ WT " "                                    
$ WT "  X     EXIT"
$ WT " "
$ INQUIRE ANS "Select the MRV you wish to connect to:"
$!
$!
$  IF ANS .EQS. "X" then goto goodbye
$!                                          
$!
$  IF ANS .EQS. "1" then SSH "[email protected]"
$!
$  IF ANS .EQS. "2" then SSH "[email protected]"    
$!
$  IF ANS .EQS. "3" then SSH "[email protected]"
$!
$  IF ANS .EQS. "4" then SSH "[email protected]"
$!
$  IF ANS .EQS. "5" then SSH "[email protected]" 
$!
$  IF ANS .EQS. "6" then SSH "[email protected]"
$!
$  IF ANS .EQS. "7" then SSH "[email protected]"   
$!
$  IF ANS .EQS. "8" then SSH "[email protected]"   
$!
$  IF ANS .EQS. "9" then SSH "[email protected]"  
$!
$  IF ANS .EQS. "10" then SSH "[email protected]"   
$!                                          
$  IF ANS .EQS. "11" then SSH "[email protected]"
$!                                                
$  IF ANS .EQS. "12" then SSH "[email protected]"        
$!            
$  IF ANS .EQS. "13" then SSH "[email protected]"
$!             
$ GOODBYE:
$!EXIT

person DCL Newb    schedule 13.04.2017    source источник
comment
Есть что-то слегка нетехническое в том, чтобы бросить меня и вернуться к тому, с чего они начали. Можете ли вы немного прояснить ситуацию? Добавление $ goto GoMenu после последнего if должно держать вас в хранимой процедуре (если это ваша цель). $ on error then goto GoMenu может помочь, если SSH завершается с ошибкой при завершении сеанса. Ссылка.   -  person HABO    schedule 13.04.2017
comment
Спасибо за вклад - так что, выгружая меня, я имею в виду, что меня вернули к подсказке VMS, а не к меню. Цель состоит в том, чтобы после того, как пользователь завершит удаленный сеанс, он вернулся в меню.   -  person DCL Newb    schedule 13.04.2017
comment
Кроме того, как мне предотвратить выход, если они выберут вариант, которого нет в списке? Например, если пользователь набирает W, он просто выходит из программы и возвращает пользователя к подсказке VMS.   -  person DCL Newb    schedule 13.04.2017
comment
Кстати - я очень ценю помощь!   -  person DCL Newb    schedule 13.04.2017


Ответы (2)


  1. Не шутите с настройками терминала!
  2. INQUIRE — это плохо, чаще всего, но пока достаточно хорошо.
  3. Используйте TYPE для больших фрагментов постоянного текста
  4. Поиск в таблице или ассоциативные массивы намного чище, чем long IF THEN ELSES
  5. Используйте F$TYPE, чтобы узнать, является ли символ STRING, INTEGER или НИЧЕГО ВООБЩЕ.

Проверьте это для некоторых идей:

$ ! MRV Terminal Server Connection Menu
$ !
$ CLS :== TYPE/PAGE NL: !  Please don't muck with my screen setting as in: SET TERMINAL/WIDTH=80
$ WT :== WRITE SYS$OUTPUT
$ ANS_1  =  "aap.xxx.xxx.xxx"
$ ANS_2  = "noot.xxx.xxx.xxx"
$ ANS_14 = "mies.xxx.xxx.xxx"
$ !
$ Menu:
$ !
$ ! If SSH (or anything else) causes an error, go back to the menu.
$ !   It is placed here because it needs to be set again after each error.
$ on error then $ goto Menu
$ !
$ type/page sys$input:

   MRV Terminal Server Connection Men

  1     MRV 1
  2     MRV 2
  :
  14    MRV 14

  X     EXIT"
$ !
$ INQUIRE ANS "Select the MRV you wish to connect to:"
$ !
$ if ANS .eqs. "X" then exit
$ if f$type(ANS_'ANS') .eqs. ""
$ then
$   ! Handle any unexpected input.
$   WT "Beg your pardon? ''ANS' ? " ! Immediately followed by clearing the screen.  Sigh.
$   WAIT 0:0:3
$ !
$ ! We did what they wanted.  How else may we serve?
$   goto Menu
$ endif
$  command = "SSH """ +  ANS_'ANS + """"
$ write sys$output "Going to execute : " + command
$
$!  'command      ! Remove Comment for real action
person Hein    schedule 14.04.2017
comment
6. Не создавайте глобальные символы для локального использования. 7. Используйте код обработки ошибок для обработки ошибок, а не просто потребляйте их без проверки. - person HABO; 14.04.2017
comment
HEIN - проверено и работает хорошо. Я добавил к этому коду две строчки, взяв пример с HABO. Когда я тестировал, после выхода из соединения с MRV меня возвращали к подсказке DCL. Я добавил: «при ошибке перейдите в МЕНЮ» и «перейдите в меню» внизу. - person DCL Newb; 18.04.2017

Это может вам больше понравиться:

$ ! MRV Terminal Server Connection Menu
$ !       
$ CLS :== SET TERMINAL/WIDTH=80
$ WT :== WRITE SYS$OUTPUT
$ !
$ Menu:
$ !
$ ! If SSH (or anything else) causes an error, go back to the menu.
$ !   It is placed here because it needs to be set again after each error.
$ on error then $ goto Menu
$ !
$ CLS
$ WT "   MRV Terminal Server Connection Menu "
$ WT " "
$ WT "  1     MRV 1"
$ WT "  2     MRV 2"
$ WT "  3     MRV 3"
$ WT "  4     MRV 4" 
$ WT "  5     MRV 5"
$ WT "  6     MRV 6"
$ WT "  7     MRV 7"
$ WT "  8     MRV 8"
$ WT "  9     MRV 9"
$ WT "  10     MRV 10"
$ WT "  11     MRV 11"
$ WT "  12     MRV 12"
$ WT "  13     MRV 13"
$ WT "  14     MRV 14"  
$ WT " "
$ WT " "
$ WT " "
$ WT " "
$ WT " "                                    
$ WT "  X     EXIT"
$ WT " "
$ !
$ INQUIRE ANS "Select the MRV you wish to connect to:"
$ !
$ if Ans .eqs. "X"
$   then
$   goto Houseclean
$ else if Ans .eqs. "1"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "2"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "3"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "4"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "5"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "6"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "7"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "8"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "9"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "10"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "11"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "12"
$   then
$   SSH "[email protected]"
$ else if Ans .eqs. "13"
$   then
$   SSH "[email protected]"
$ else
$   ! Handle any unexpected input.
$   WT "Beg your pardon?" ! Immediately followed by clearing the screen.  Sigh.
$   endif
$ !
$ ! We did what they wanted.  How else may we serve?
$ goto Menu
$ !             
$ Houseclean:
$   ! Nothing else to do.
$   exit ! Or perhaps you prefer $ logout
person HABO    schedule 13.04.2017