【问题标题】:DCL Programming - Remote connectionsDCL 编程 - 远程连接
【发布时间】:2017-04-13 00:27:17
【问题描述】:

首先,我是一个完全的新手,不应该被允许使用键盘。也就是说,我正在尝试编写一个 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 "InReach@xxx.xxx.xxx.xxx"
$!
$  IF ANS .EQS. "2" then SSH "InReach@xxx.xxx.xxx.xxx"    
$!
$  IF ANS .EQS. "3" then SSH "InReach@xxx.xxx.xxx.xxx"
$!
$  IF ANS .EQS. "4" then SSH "InReach@xxx.xxx.xxx.xxx"
$!
$  IF ANS .EQS. "5" then SSH "InReach@xxx.xxx.xxx.xxx" 
$!
$  IF ANS .EQS. "6" then SSH "InReach@xxx.xxx.xxx.xxx"
$!
$  IF ANS .EQS. "7" then SSH "InReach@xxx.xxx.xxx.xxx"   
$!
$  IF ANS .EQS. "8" then SSH "InReach@xxx.xxx.xxx.xxx"   
$!
$  IF ANS .EQS. "9" then SSH "InReach@xxx.xxx.xxx.xxx"  
$!
$  IF ANS .EQS. "10" then SSH "InReach@xxx.xxx.xxx.xxx"   
$!                                          
$  IF ANS .EQS. "11" then SSH "InReach@xxx.xxx.xxx.xxx"
$!                                                
$  IF ANS .EQS. "12" then SSH "InReach@xxx.xxx.xxx.xxx"        
$!            
$  IF ANS .EQS. "13" then SSH "InReach@xxx.xxx.xxx.xxx"
$!             
$ GOODBYE:
$!EXIT

【问题讨论】:

  • “把我赶出去”和“回到他们开始的地方”有点不专业。你能澄清一下吗?在最后一个 if 之后添加 $ goto GoMenu 应该让您保留在存储过程中(如果这是您的目标)。如果会话终止时 SSH 因错误退出,$ on error then goto GoMenu 可能会有所帮助。 Ref.
  • 感谢您的输入 - 所以,“将我赶出去”是指我返回到 VMS 提示而不是返回菜单。目标是,在用户结束远程会话后,他们将返回到菜单。
  • 另外,如果他们选择了未列出的选项,我该如何防止它退出?例如,如果用户键入 W,它只会退出程序并将用户返回到 VMS 提示符。
  • 顺便说一句 - 非常感谢您的帮助!

标签: openvms dcl


【解决方案1】:
  1. 不要乱用终端设置!
  2. INQUIRE 通常是不好的,但现在已经足够了。
  3. 对大块常量文本使用 TYPE
  4. 表查找或关联数组比 long IF THEN ELSES 干净得多
  5. 使用 F$TYPE 查看符号是 STRING、INTEGER 还是 NOTHING-AT-ALL

看看这里有一些想法:

$ ! 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

【讨论】:

  • 6.不要为本地使用创建全局符号。 7. 使用错误处理代码来处理错误,而不是在没有检查的情况下直接使用它们。
  • HEIN - 经过测试并且运行良好。我在这段代码中添加了两行,取自 HABO 的示例。当我测试时,在退出与 MRV 的连接后,我又回到了 DCL 提示符。我在底部添加了:'on error then goto MENU'和'goto menu'。
【解决方案2】:

这可能更符合你的喜好:

$ ! 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 "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "2"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "3"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "4"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "5"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "6"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "7"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "8"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "9"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "10"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "11"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "12"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ else if Ans .eqs. "13"
$   then
$   SSH "InReach@xxx.xxx.xxx.xxx"
$ 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多