home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 September / CHIPCD_9_99.iso / software / testsoft / pcanywhere / SAMPLE.SCR < prev    next >
Text File  |  1999-05-10  |  67KB  |  1,437 lines

  1.  
  2.  
  3.  
  4. ;  *******************************************************************
  5. ;  *                                     *
  6. ;  *              pcANYWHERE sample script "SAMPLE.SCR"              *
  7. ;  *            Copyright 1998-1999 Symantec Corporation         *
  8. ;  *                Created by Larry R. McDowall                    *
  9. ;  *                                     *
  10. ;  *******************************************************************
  11. ;
  12. ;
  13. ;
  14. ;
  15. ;    TABLE OF CONTENTS
  16. ;    *****************
  17. ;
  18. ;    Introduction        Describes the purpose of this script.
  19. ;    How This Script Works    Brief description of what this script does.
  20. ;    Setup and Installation    How to install and use this script.
  21. ;    Support            How to obtain support for this script.
  22. ;    Main Body of Script    The script's code and subroutines.
  23. ;    Technical Overview    This appears after the main body of the script.
  24. ;                This section includes extensive descriptions
  25. ;                of how this script works.
  26. ;
  27. ;
  28. ;    INTRODUCTION
  29. ;    ************
  30. ;
  31. ;    The purpose of this script is to illustrate how to use key procedures
  32. ;     in the pcANYWHERE Scripting Language. For more information on these
  33. ;    procedures, please refer to the Technical Overview at the end of this
  34. ;    script.
  35. ;
  36. ;    The following procedures are included in this script:
  37. ;
  38. ;    * How to check for errors and lost connections.
  39. ;    * How to schedule a script.
  40. ;    * How to run a script from a command line.
  41. ;    * How to use a log file.
  42. ;    * How to use a data file to call multiple hosts using a modem.
  43. ;    * How to transfer a file.
  44. ;    * How to run a program.
  45. ;    * How to pause a script while a program runs.
  46. ;
  47. ;
  48. ;    HOW THIS SCRIPT WORKS
  49. ;    *********************
  50. ;
  51. ;    The following describes how this script works:
  52. ;
  53. ;    1. Create or open the log file LOG.PCA, the host data file HOSTS.PCA,
  54. ;       and the sample application SCRIPT.BAT.
  55. ;
  56. ;    2. Read the next host computer's name to call from the DATA.PCA file.
  57. ;
  58. ;    3. Call the next host computer using a modem as read from the DATA.PCA
  59. ;       file.
  60. ;
  61. ;    4. Transfer the remote computer's C:\SCRIPT.BAT file to the host
  62. ;       computer's C: drive.
  63. ;
  64. ;    5. Delete the flag file PCA.FLG on both the remote and host computers
  65. ;       if it exists on either of them.
  66. ;
  67. ;    6. Run the SCRIPT.BAT file on the host computer.
  68. ;
  69. ;    7. Pause the script while the SCRIPT.BAT file runs. The script loops
  70. ;       looking for the existence of the new PCA.FLG file that the SCRIPT.BAT
  71. ;       file will create once it is finished.
  72. ;
  73. ;    8. After the script detects the PCA.FLG file which indicates that the
  74. ;       SCRIPT.BAT file has finished, disconnect from the host computer.
  75. ;
  76. ;    9. If there are more host computers to call, the script goes back to
  77. ;       number 2 and continues until there are no more hosts to call.
  78. ;
  79. ;    10. The script closes the LOG.PCA and DATA.PCA files. If any errors
  80. ;        occurred while the script ran, the LOG.PCA file is displayed using
  81. ;        the Notepad application from Windows.
  82. ;
  83. ;    11. The script ends.
  84. ;    
  85. ;
  86. ;    SETUP AND INSTALLATION
  87. ;    **********************
  88. ;
  89. ;    Step 1. Use a supported version of pcANYWHERE on both the remote and
  90. ;        host computers. Apply any updates for each from the Symantec
  91. ;        web site or BBS. This script supports the following pcANYWHERE
  92. ;        versions running on the specified operating systems:
  93. ;
  94. ;        * pcAnywhere 9.0 for Windows 95/98, and Windows NT 4.0.
  95. ;           * pcANYWHERE32 8.0 for Windows 95/98 and Windows NT 4.0/3.51.
  96. ;            * pcANYWHERE 2.0 for Windows 3.1 and Windows 95.
  97. ;            * pcANYWHERE 5.0 for DOS.
  98. ;        * Scripts running between pcAnywhere 9.0 or pcANYWHERE32 8.0 to
  99. ;          pcANYWHERE 5.0 are not currently supported. For more
  100. ;          information, please refer to the Symantec Knowledge Base 
  101. ;          document "How to Write a Script from pcANYWHERE32 to a DOS-
  102. ;          based pcANYWHERE".
  103. ;        * NOTE: Any version of pcANYWHERE other than those listed above
  104. ;          are not supported. If you experience issues when using an old
  105. ;          version of pcANYWHERE, it is strongly recommended to upgrade
  106. ;          to a current version.
  107. ;    
  108. ;    Step 2. Copy this script to your pcANYWHERE program directory on the
  109. ;        remote computer.
  110. ;
  111. ;    Step 3. There will be one host that will be called twice using a modem,
  112. ;        named "MODEM". This remote control item requires the host
  113. ;        computer's modem number, along with a logon name and password
  114. ;        (if applicable). 
  115. ;
  116. ;        * pcAnywhere 9.0 and pcANYWHERE32 8.0 already have a MODEM item
  117. ;              located under the "Remote Control" area. Enter your host's
  118. ;              modem number in it's Properties section under the Settings
  119. ;          tab.
  120. ;        * All other versions of pcANYWHERE will need to have the MODEM
  121. ;          remote control item created and then have the host's modem
  122. ;          number entered into its properties.
  123. ;
  124. ;    Step 4. The host computer must be put into "waiting" mode, waiting for
  125. ;        an incoming call from the remote computer. Ensure that the
  126. ;        modem line used by the host does not have any other device, such
  127. ;        as a fax machine or voice mail, attached to it.
  128. ;
  129. ;    Step 5. Run the script from pcANYWHERE on your remote computer.
  130. ;
  131. ;
  132. ;    SUPPORT
  133. ;    *******
  134. ;
  135. ;    This script is provided as-is. pcANYWHERE Technical Support may answer
  136. ;    specific questions about a specific script command, but they cannot
  137. ;    assist you in troubleshooting or programming this or other scripts.
  138. ;    Support may or may not be given if you modify this script in any
  139. ;    way, and then have issues using it. (Does the script work without
  140. ;    modifying it?) However, pcANYWHERE Technical Support does offer a Script
  141. ;    Consulting service which can help you troubleshoot or program a script.
  142. ;
  143. ;    Additional information about how to write or troubleshoot a script can
  144. ;    be found in the Symantec Knowledge Base. The following documents are
  145. ;    important resources there:
  146. ;
  147. ;       * "How to Obtain Support for the pcANYWHERE Scripting Language"
  148. ;       * "pcANYWHERE Scripting Language Technical Documents"
  149. ;       * "How to Write a Script to Connect to a Host Computer"
  150. ;       * "How to Write a Script to Connect to an Online Service"
  151. ;       * "How to Troubleshoot a Script"
  152. ;       * "How to Transfer Files to or From a Host Computer Using a Script"
  153. ;       * "How to Transfer Files to or From an Online Service Using a Script"
  154. ;
  155. ;    Updates to this script can be found on the Symantec web site, at:
  156. ;
  157. ;    Symantec
  158. ;    www.symantec.com
  159. ;
  160. ;    Script Consulting provides two levels of support for your pcANYWHERE
  161. ;    Scripting Language needs:
  162. ;
  163. ;    1. Script Consulting and Troubleshooting. This is a fee-based service.
  164. ;       This service covers answering advanced questions about how to use
  165. ;       the Scripting Language or how to program it, and also provides
  166. ;       troubleshooting for a script that you have written.
  167. ;
  168. ;    2. Script Programming. This is a fee-based service where a Script
  169. ;       Consultant will program a script for you to your specifications.
  170. ;
  171. ;    If you are interested in obtaining Script Consulting or Programming, you
  172. ;    may contact pcANYWHERE Technical Support and request that a Script
  173. ;    Consultant contact you to discuss your needs. Please contact our
  174. ;    StandardCare support number for this service:
  175. ;
  176. ;    pcANYWHERE StandardCare Support: (541) 465-8430
  177.  
  178.  
  179.  
  180.  
  181. ; *******************************************************************
  182. ; VARIABLES - Declares variables for the script to use.
  183. ; *******************************************************************
  184.  
  185. Integer ERR_COUNT             ; Total number of errors during script.
  186. Integer I                 ; Increments to allow script to pause.
  187. Integer LOOP                 ; Sets total number of loops to use.
  188. Integer RES                 ; Sets success/failure of a subroutine.
  189. String CDIR[255]             ; Sets the working directory.
  190. String CDIR2[255]             ; The secondary string for the work dir.
  191. String ERR[255]                 ; Stores $ERROR value if error occurs.
  192. String ERR_AMOUNT[255]             ; Allows log file to save $ERROR value.
  193. String HOST[255]             ; Name of the host computer to call.
  194. String LOG[255]                 ; The primary log description.
  195. String LOG2[255]             ; The secondary log description.
  196. String SOURCE[255]             ; Source file name to file transfer.
  197. CDIR = $CURDIR                 ; Assign CDIR to the working directory.
  198. StrLen CDIR                 ; Check for root drive.
  199. If $RESULT == 3 Then SubStr CDIR 1 2  CDIR  ; If root, remove "\" in path name.
  200.  
  201.  
  202. ; *******************************************************************
  203. ; MAIN - Controls branching to subroutines.
  204. ; *******************************************************************
  205. ;
  206. ; NOTE 1: If you want the script to schedule itself to begin execution at a
  207. ; later date and time than when you run it, remove the semicolon to the left of
  208. ; the "Wait Until 2359" command found at the beginning of the MAIN
  209. ; subroutine.
  210. ;
  211. ; By default, the script will then begin execution at 11:59 PM on the same day
  212. ; it was run. You may want to change the time to start from 2359 to something a
  213. ; few minutes from when you will be testing the script. Use 24-hour format for
  214. ; the time.
  215. ;
  216. ; A script runs on the same day it is launched with this method. If you assign
  217. ; the time to be 0000, midnight, then the script will not run, but will stay
  218. ; as a black terminal window (its dormant mode until it would have normally
  219. ; started). This is because midnight has already occurred today. Instead, use
  220. ; 2359 or a similar "near-midnight" time for the current day, as in the
  221. ; example above.
  222. ;
  223. ; If you have pcANYWHERE32 8.0, 8.01, or 8.02, and you want to use the Wait
  224. ; Until command without a date parameter, then you should apply a special
  225. ; update to pcANYWHERE32 to enable it to work with just the time parameter.
  226. ; Otherwise, the script will not start at the specified time. With this update,
  227. ; a script can be run each day, without having to change the date, and then
  228. ; start at the prespecified time. This update can be found here:
  229. ;
  230. ; FTP Location for AWSCR32.DLL File
  231. ; ftp://ftp.symantec.com/public/english_us_canada/products/pcanywhere/
  232. ; pcanywhere32/beta/AWSCR32.DLL
  233. ;
  234. ; Note that the file name is required to be uppercase, whereas the other part
  235. ; of the link does not have to be.
  236. ;
  237. ; To install this, simply copy it over the original AWSCR32.DLL file, in the
  238. ; pcANYWHERE32 directory. (Make sure that pcANYWHERE32 is not running when you
  239. ; do this.)
  240. ;
  241. ; For more information on how to schedule a script, please refer to the sections
  242. ; "How to Schedule a Script Using a Third Party Scheduler" and "How to Program a
  243. ; Script to Schedule Itself" which are both found in the Technical Overview at
  244. ; the end of the script.
  245. ;
  246. ; NOTE 2: If you do not want the script to display the log file if errors
  247. ; occurred, add a semicolon to the left of the "If ERR_COUNT > 0 THEN GoSub
  248. ; @DISPLAY_LOG" command line near the end of the MAIN subroutine.
  249. ;
  250. ; Please refer to the DISPLAY_LOG subroutine for information on how to configure
  251. ; the display of the log file.
  252. ;
  253.  
  254. @MAIN:                     ; The primary subroutine of the script.
  255. ;  Wait Until 2359             ; Schedules script to start at 11:59 PM.
  256.   GoSub @OPEN_FILES             ; Opens necessary files.
  257.   If RES == 1 GoTo @MAIN_END           ; If cannot open log file, abort script.
  258.   If RES == 2 GoTo @MAIN_CLOSE          ; If cannot open other files, end script.
  259.  
  260. @MAIN_CALL_HOSTS:             ; Main subroutine that controls and calls
  261.                      ; other subroutines.
  262.   RES = 0                 ; Reset subroutine success/failure.
  263.   GoSub @NEXT_HOST             ; Read next host to call from DATA.PCA.
  264.   If RES == 1 GoTo @MAIN_CLOSE          ; If no more hosts to call, end script.
  265.   GoSub @CALL_HOST             ; Call the next host.
  266.   If RES == 1 GoTo @MAIN_CALL_HOSTS  ; If call to host failed, call next host.
  267.   GoSub @TRANSFER_FILE             ; Transfer the SCRIPT.BAT file to host.
  268.   If RES == 1 GoTo @MAIN_DISCONNECT  ; If error, disconnect and call next host.
  269.   If RES == 2 GoTo @MAIN_CALL_HOSTS  ; If lost connection, call next host.
  270.   GoSub @RUN_FILE             ; Run the SCRIPT.BAT on the host.
  271.   If RES == 1 GoTo @MAIN_CALL_HOSTS  ; If lost connection, call next host.
  272.  
  273. @MAIN_DISCONNECT:             ; Subroutine used to disconnect from host.
  274.   LOG = "Disconnecting from host '"  ; Create a log description.
  275.   StrCat LOG HOST             ; Add host's name to the description.
  276.   StrCat LOG "'."             ; End the description.
  277.   GoSub @WRITE_LOG             ; Write the description to the log.
  278.   If $DCD !=1 Then GoSub @LOST_CONNECTION  ; Lost connection.
  279.   If $DCD == 1 Then Session End         ; Disconnect from the host.
  280.   GoTo @MAIN_CALL_HOSTS             ; Call the next host.
  281.  
  282. @MAIN_CLOSE:                 ; Subroutine used to end the script.
  283.   ERR_AMOUNT = ERR_COUNT         ; Convert ERR_COUNT to a string.
  284.   LOG = "Script completed with "     ; Create a log description.
  285.   StrCat LOG ERR_AMOUNT             ; Add total errors that occurred.
  286.   LOG2 = " error(s)."             ; Add " errors(s)." to the description.
  287.   StrCat LOG LOG2             ; End the description.
  288.   GoSub @WRITE_LOG             ; Write the description to the log.
  289.   Close 1                 ; Close the log file.
  290.   Close 2                 ; Close the DATA.PCA file.
  291.  
  292. @MAIN_END:                 ; Subroutine used to end the script.
  293.   If ERR_COUNT > 0 Then GoSub @DISPLAY_LOG  ; If any errors, display log file.
  294.   End                     ; End the script.
  295.  
  296.  
  297.  
  298.  
  299. ; *******************************************************************
  300. ; OPEN FILES - Opens or creates necessary files for script to use.
  301. ; *******************************************************************
  302.  
  303. @OPEN_FILES:                 ; Subroutine used to create log file.
  304.   Find First ".\LOG.PCA"         ; Try to find the LOG.PCA file.
  305.   If $RESULT == 1 GoTo @OPEN_FILES_LOG_DATA_SCRIPT  ; If found, open log file.
  306.   Create 1 ".\LOG.PCA" "W"         ; If not found, create it.
  307.   Write Line 1 "**** pcANYWHERE Script Log File ****"  ; Add title.
  308.   Close 1                 ; Close the log file.
  309.  
  310. @OPEN_FILES_LOG_DATA_SCRIPT:         ; Subroutine used to open necessary files.
  311.   $ERROR = 0                 ; Reset the value of $ERROR to 0.
  312.   Open 1 ".\LOG.PCA" "W"         ; Open the log file.
  313.   ERR = $ERROR                 ; Assign ERR the value of $ERROR.
  314.   If $ERROR < 0 GoTo @OPEN_FILES_ERROR_LOG  ; If error, abort the script.
  315.   Seek 1 0 2                 ; Position the pointer to end of file.
  316.   Write Line 1 " "             ; Write a blank line.
  317.   LOG = "Starting script."         ; Create log description.
  318.   GoSub @WRITE_LOG             ; Write the description to the log.
  319.   $ERROR = 0                 ; Reset the value of $ERROR to 0.
  320.   Create 2 ".\DATA.PCA" "W"         ; Create the HOSTS.PCA file.
  321.   ERR = $ERROR                 ; Assign ERR the value of $ERROR.
  322.   If $ERROR < 0 GoTo @OPEN_FILES_ERROR_DATA  ; If error, end the script.
  323.   Write Line 2 "MODEM"               ; Write 1st name of host to call.
  324.   Write Line 2 "MODEM"             ; Write 2nd name of host to call.
  325.   Close 2                 ; Close the DATA.PCA file.
  326.   Open 2 ".\DATA.PCA" "R"         ; Open DATA.PCA file for read-only.
  327.   $ERROR = 0                 ; Reset the value of $ERROR to 0.
  328.   Create 3 "C:\SCRIPT.BAT" "W"         ; Create the SCRIPT.BAT file.
  329.   ERR = $ERROR                 ; Assign ERR the value of $ERROR.
  330.   If $ERROR < 0 GoTo @OPEN_FILES_ERROR_SCRIPT  ; If error, end the script.
  331.   Write Line 3 "@ECHO OFF"         ; Write "@ECHO OFF" to the file.
  332.   Write Line 3 "C:"             ; Write "C:" to the file.
  333.   Write Line 3 "CD \"             ; Write "CD \" to the file.
  334.   Write Line 3 "DIR /A"             ; Write "DIR /A" to the file.
  335.   Write Line 3 "DIR >PCA.FLG"         ; Write "DIR >PCA.FLG" to the file.
  336.   Close 3                 ; Close the SCRIPT.BAT file.
  337.   RES = 0                 ; Set return code to success.
  338.   Return                 ; Return to the MAIN subroutine.
  339.  
  340. @OPEN_FILES_ERROR_LOG:             ; Subroutine used if cannot open log.
  341.   LOG = "Error "             ; Create a message description.
  342.   StrCat LOG ERR             ; Add $ERROR value.
  343.   StrCat LOG " while accessing the LOG.PCA file."  ; End message.
  344.   Type Line LOG                 ; Display the message.
  345.   Wait 10                 ; Wait 10 seconds.
  346.   RES = 1                 ; Set return code to failure.
  347.   Return                 ; Return to the MAIN subroutine.
  348.  
  349. @OPEN_FILES_ERROR_DATA:             ; Subroutine used if cannot open DATA.PCA.
  350.   LOG2 = "while accessing the DATA.PCA file."  ; Create log description.
  351.   GoSub @ERROR                 ; Add the error number.
  352.   RES = 2                 ; Set return code to failure.
  353.   Return                 ; Return to the MAIN subroutine.
  354.  
  355. @OPEN_FILES_ERROR_SCRIPT:         ; Subroutine used if cannot open
  356.                      ; SCRIPT.BAT.
  357.   LOG2 = "while accessing the SCRIPT.BAT file."  ; Create description.
  358.   GoSub @ERROR                 ; Add the error number.
  359.   RES = 2                 ; Set return code to failure.
  360.   Return                 ; Return to the MAIN subroutine.
  361.  
  362.  
  363.  
  364.  
  365. ; *******************************************************************
  366. ; NEXT HOST - Read the next host computer to call from data file.
  367. ; *******************************************************************
  368.  
  369. @NEXT_HOST:                 ; Subroutine used to read next host
  370.                      ; to call.
  371.   $ERROR = 0                 ; Reset the value of $ERROR to 0.
  372.   Read Line 2 HOST             ; Assign HOST to the next host to call.
  373.   If $ERROR < 0 GoTo @NEXT_HOST_DONE ; If error, end the script.
  374.   StrLen HOST                 ; Check if HOST value is valid.
  375.   If $RESULT < 1 GoTo @NEXT_HOST_DONE  ; If error, end the script.
  376.   RES = 0                 ; Set return code to success.
  377.   Return                 ; Return to the MAIN subroutine.
  378.  
  379. @NEXT_HOST_DONE:             ; Subroutine used if no more hosts to call.
  380.   RES = 1                 ; Set return code to failure.
  381.   Return                 ; Return to the MAIN subroutine.
  382.  
  383.  
  384.  
  385.  
  386. ; *******************************************************************
  387. ; CALL HOST - Calls the next host computer.
  388. ; *******************************************************************
  389.  
  390. @CALL_HOST:                 ; Subroutine used to call the next host.
  391.   Session Retry 3             ; Retry calling a host three times.
  392.   Session Delay 1             ; Wait one minute before redialing.
  393.   LOG = "Calling host '"         ; Create a log description.
  394.   StrCat LOG HOST             ; Add the host name.
  395.   StrCat LOG "'."             ; End the description.
  396.   GoSub @WRITE_LOG             ; Write the description to the log.
  397.   Wait 5                 ; Used to wait five seconds before dialing
  398.                      ; the host to enable it to correctly reset
  399.                      ; its modem.
  400.   Session Dial HOST             ; Call the host computer.
  401.   If $DCD != 1 GoTo @CALL_HOST_NO_CONNECTION  ; If no connection, call
  402.                                               ; next host.
  403.   LOG = "Successfully connected to host '"  ; Create a log description.
  404.   StrCat LOG HOST             ; Add the host name to the description.
  405.   StrCat LOG "'."             ; End the description.
  406.   GoSub @WRITE_LOG             ; Write the description to the log.
  407.   RES = 0                 ; Set return code to success.
  408.   Return                 ; Return to the MAIN subroutine.
  409.  
  410. @CALL_HOST_NO_CONNECTION:            ; Subroutine used for no connection.
  411.   ERR_COUNT = ERR_COUNT + 1          ; Increment how many errors occurred.
  412.   LOG = "Error: unable to connect to host '"  ; Create a log description.
  413.   StrCat LOG HOST             ; Add the host name.
  414.   StrCat LOG "'."             ; End the description.
  415.   GoSub @WRITE_LOG             ; Write description to the log.
  416.   RES = 1                 ; Set return code to failure.
  417.   Return                 ; Return to the MAIN subroutine.
  418.  
  419.  
  420.  
  421.  
  422. ; *******************************************************************
  423. ; TRANSFER FILE - Transfers a file from the remote to the host.
  424. ; *******************************************************************
  425.  
  426. @TRANSFER_FILE:                 ; Subroutine used to transfer a file.
  427.   SOURCE = "C:\SCRIPT.BAT"           ; Assign the source name.
  428.   If $DCD != 1 GoTo @TRANSFER_FILE_LOST  ; If lost connection, call next host.
  429.   $ERROR = 0                 ; Reset the value of $ERROR to 0.
  430.   SessOpr Remote Send SOURCE "C:\SCRIPT.BAT"  ; Transfer file.
  431.   ERR = $ERROR                 ; Assign ERR the value of $ERROR.
  432.   If $ERROR < 0 GoTo @TRANSFER_FILE_ERROR  ; If error, call next host.
  433.   LOG = "Transfer of '"             ; Create a log description.
  434.   StrCat LOG SOURCE             ; Add the source file name.
  435.   LOG2 = "' was successful."         ; Add "' was successful." to description.
  436.   StrCat LOG LOG2             ; End the description.
  437.   GoSub @WRITE_LOG             ; Write the description to the log.
  438.   RES = 0                 ; Set return code to success.
  439.   GoSub @LOOP                 ; Allows time for file manager to reset. 
  440.                      ; Needed for pcAnywhere 9.0 and
  441.                      ; pcANYWHERE32 8.0 only.
  442.   Return                 ; Return to the MAIN subroutine.
  443.  
  444. @TRANSFER_FILE_ERROR:             ; Subroutine used if file transfer failed.
  445.   LOG2 = "while transferring '"         ; Create a log description.
  446.   StrCat LOG2 SOURCE             ; Add the source file name.
  447.   StrCat LOG2 "'."             ; End the description.
  448.   GoSub @ERROR                 ; Add the error number.
  449.   RES = 1                 ; Set return code to failure.
  450.   Return                 ; Return to the MAIN subroutine.
  451.  
  452. @TRANSFER_FILE_LOST:             ; Subroutine used if lost connection.
  453.   GoSub @LOST_CONNECTION         ; Create and save a log description.
  454.   RES = 2                 ; Set return code to failure.
  455.   Return                 ; Return to the MAIN subroutine.
  456.  
  457.  
  458.  
  459.  
  460. ; *******************************************************************
  461. ; RUN FILE - Runs a file on the host computer.
  462. ; *******************************************************************
  463.  
  464. @RUN_FILE:                 ; Subroutine used to run a file on host.
  465.   Del "C:\PCA.FLG"             ; Delete flag file on remote.
  466.   If $DCD != 1 GoTo @RUN_FILE_LOST   ; If lost connection, call next host.
  467.   SessOpr Host Run "COMMAND.COM /C DEL C:\PCA.FLG"  ; Delete on host.
  468.   GoSub @LOOP                 ; Pause script for five seconds.
  469.   LOG = "Executing 'C:\SCRIPT.BAT' on the host..."  ; Create description.
  470.   GoSub @WRITE_LOG             ; Write the description to the log.
  471.   If $DCD != 1 GoTo @RUN_FILE_LOST   ; If lost connection, call next host.
  472.   SessOpr Host Run "COMMAND.COM /C C:\SCRIPT.BAT"  ; Run SCRIPT.BAT.
  473.   GoSub @CHECK_FLAG             ; Pause script while SCRIPT.BAT runs.
  474.   RES = 0                 ; Set return code to success.
  475.   Return                 ; Return to MAIN subroutine.
  476.  
  477. @RUN_FILE_LOST:                 ; Subroutine used if lost connection.
  478.   GoSub @LOST_CONNECTION         ; Create and save a log description.
  479.   RES = 1                 ; Set return code to failure.
  480.   Return                 ; Return to the MAIN subroutine.
  481.  
  482.     
  483.  
  484.  
  485. ; *******************************************************************
  486. ; WRITE LOG - Writes a description to the log file.
  487. ; *******************************************************************
  488.     
  489. @WRITE_LOG:                 ; Subroutine used to write log description.
  490.   Write String 1 $DATE             ; Write the current date.
  491.   Write String 1 " "             ; Write a blank space.
  492.   Write String 1 $TIME             ; Write the current time.
  493.   Write String 1 "   "             ; Write a tab.
  494.   Write Line 1 LOG             ; Write the log description.
  495.   Return                 ; Return to the calling subroutine.
  496.  
  497.  
  498.  
  499.  
  500. ; *******************************************************************
  501. ; DISPLAY LOG - Displays the log file if any errors occurred.
  502. ; *******************************************************************
  503. ;
  504. ; NOTE: If you do not want the script to display the log file if errors
  505. ; occurred, add a semicolon to the left of the "If ERR_COUNT > 0 Then GoSub
  506. ; @DISPLAY_LOG" command line near the end of the MAIN subroutine.
  507. ;
  508. ; Information in the log file is added at the end of it each time the script
  509. ; runs. To view the last script session, you will need to go to the bottom of
  510. ; the log file after Notepad displays it. Use the Ctrl+End keystrokes or use the
  511. ; PageDown key to cycle down to the end.
  512. ;
  513. ; By default, Notepad will be used to display the log file. If the log file
  514. ; becomes too large, you will need to use an alternate text editor such as Write
  515. ; or WordPad. If your remote computer's operating system is DOS, you will need
  516. ; to use a DOS-based text editor such as the EDIT command. You may also need to
  517. ; specify the full path to the EDIT command instead of just it's file name.
  518.  
  519. @DISPLAY_LOG:                 ; Subroutine used to show log file.
  520.   CDIR2 = "NOTEPAD "                 ; Create beginning of the command.
  521.   StrCat CDIR2 CDIR             ; Add the current working directory.
  522.   StrCat CDIR2 "\LOG.PCA"         ; Add the log file name and end.
  523.   RUN CDIR2                 ; Display log file.
  524.   Return                 ; Return to the MAIN subroutine.
  525.  
  526.  
  527.  
  528.  
  529. ; *******************************************************************
  530. ; CHECK FLAG - Loops to pause the script until SCRIPT.BAT finishes.
  531. ; *******************************************************************
  532. ;
  533. ; NOTE 1: If you want to run a program on the remote computer and the script
  534. ; needs to pause while this program runs, the below procedure will need to be
  535. ; changed slightly. The command "SessOpr Host Send "C:\PCA.FLG" "C:\PCA.FLG""
  536. ; will need to be replaced with the commands:
  537. ;
  538. ;    Find First "C:\PCA.FLG"
  539. ;    If $RESULT == 0 GoTo @CHECK_FLAG_FILE
  540. ;
  541. ; This loops the subroutine if the C:\PCA.FLG file cannot be found on the remote
  542. ; computer.
  543.  
  544. @CHECK_FLAG:                 ; Subroutine used to pause the script.
  545.   LOOP = 0                 ; Reset the value of LOOP to 0.
  546.  
  547. @CHECK_FLAG_FILE:             ; Subroutine used find flag file.
  548.   GoSub @LOOP                 ; Pause script for five seconds.
  549.   LOOP = LOOP + 1             ; Increment the value of LOOP.
  550.   If LOOP == 24 GoTo @CHECK_FLAG_ERROR  ; If LOOP takes too long, abort.
  551.   If $DCD != 1 GoTo @CHECK_FLAG_LOST ; If lost connection, end loop.
  552.   $ERROR = 0                 ; Reset the value of $ERROR to 0.
  553.   SessOpr Host Send "C:\PCA.FLG" "C:\PCA.FLG"  ; Attempt file transfer.
  554.   If $ERROR == -8 GoTo @CHECK_FLAG_FILE  ; If file not found, loop.
  555.   If $ERROR < 0 GoTo @CHECK_FLAG_OTHER  ; If other error, end loop.
  556.   LOG = "Execution of 'C:\SCRIPT.BAT' on the host was successful."
  557.                      ; Create a log description.
  558.   GoSub @WRITE_LOG             ; Write the description to the log.
  559.   Del "C:\PCA.FLG"             ; Delete the flag file on the remote.
  560.   If $DCD != 1 GoTo @CHECK_FLAG_LOST ; If lost connection, call next host.
  561.   SessOpr Host Run "COMMAND.COM /C DEL PCA.FLG"    ; Delete on the host.
  562.   RES = 0                 ; Set return code to neutral value.
  563.   Return                  ; Return to the RUN_FILE subroutine.
  564.  
  565. @CHECK_FLAG_ERROR:             ; Subroutine used to time loop out.
  566.   ERR_COUNT = ERR_COUNT + 1          ; Increment how many errors occurred.
  567.   LOG = "Error: execution of 'C:\SCRIPT.BAT' on the host timed out."
  568.                      ; Create a log description.
  569.   GoSub @WRITE_LOG             ; Write the description to the log.
  570.   RES = 0                 ; Set return code to neutral value.
  571.   Return                 ; Return to the RUN_FILE subroutine.
  572.  
  573. @CHECK_FLAG_LOST:             ; Subroutine used if lost connection.
  574.   GoSub @LOST_CONNECTION         ; Create and save a log description.
  575.   RES = 1                 ; Set return code for failure.
  576.   Return                 ; Return to the RUN_FILE subroutine.
  577.  
  578. @CHECK_FLAG_OTHER:             ; Subroutine used for generic error.
  579.   LOG2 = "occurred while running 'C:\SCRIPT.BAT' on the host."
  580.                      ; Create a log description.
  581.   GoSub @ERROR                 ; Add the error number.
  582.   RES = 0                 ; Set return code to neutral value.
  583.   Return                 ; Return to the RUN_FILE subroutine.
  584.  
  585.  
  586.  
  587.  
  588. ; *******************************************************************
  589. ; LOOP - Pauses script by incrementing an integer.
  590. ; *******************************************************************
  591. ;
  592. ; NOTE: By default, the LOOP subroutine pauses the script for about five
  593. ; seconds. This time is determined by the number 50,000. You may need to
  594. ; increase or decrease this number depending on the speed of your remote
  595. ; computer however.
  596.  
  597. @LOOP:                     ; Subroutine used to pause the script.
  598.   I = 0                     ; Reset the value of I to 0.
  599.  
  600. @LOOP_SCRIPT:                 ; Subroutine used loop the script.
  601.   I = I + 1                 ; Increment the value of I.
  602.   If I != 50000 GoTo @LOOP_SCRIPT    ; If not five seconds, loop.
  603.   Return                 ; Return to calling subroutine.
  604.  
  605.  
  606.  
  607.  
  608. ; *******************************************************************
  609. ; ERROR - Writes error number to the log file.
  610. ; *******************************************************************
  611.  
  612. @ERROR:                     ; Subroutine used to trap errors.
  613.   ERR_COUNT = ERR_COUNT + 1          ; Increment how many errors occurred.
  614.   LOG = "Error "             ; Create a log description.
  615.   StrCat LOG ERR             ; Add the error number.
  616.   StrCat LOG " occurred "         ; Add " occurred ".
  617.   StrCat LOG LOG2             ; Add the description.
  618.   GoSub @WRITE_LOG             ; Write the description to the log.
  619.   Return                 ; Return to the calling subroutine.
  620.  
  621.  
  622.  
  623.  
  624. ; *******************************************************************
  625. ; LOST CONNECTION - Write lost connection information to log file.
  626. ; *******************************************************************
  627.  
  628. @LOST_CONNECTION:             ; Subroutine used to trap lost connections.
  629.   ERR_COUNT = ERR_COUNT + 1          ; Increment how many errors occurred.
  630.   LOG = "Error: lost connection to host '"  ; Create description.
  631.   StrCat LOG HOST             ; Add the host name.
  632.   StrCat LOG "'."             ; End the description.
  633.   GoSub @WRITE_LOG             ; Write the description to the log.
  634.   Return                 ; Return to the calling subroutine.
  635.  
  636.  
  637.  
  638.  
  639. ;    **************************
  640. ;    **  TECHNICAL OVERVIEW  **
  641. ;    **************************
  642. ;
  643. ;    
  644. ;
  645. ;
  646. ;    TABLE OF CONTENTS FOR TECHNICAL OVERVIEW
  647. ;    ****************************************
  648. ;
  649. ;    Subroutines
  650. ;    How to Troubleshoot this Script
  651. ;    Checking a Command's Results After it Runs - How to Use $RESULT
  652. ;    Checking for Errors When a Script Runs - How to Use $ERROR
  653. ;    Checking for Lost Connections - How to Use $DCD
  654. ;    How to Use a Network or Cable to Connect to a Host Using a Script
  655. ;    How to Convert an Integer to a String Variable
  656. ;    How to Schedule a Script Using a Third Party Scheduler
  657. ;    How to Program a Script to Schedule Itself
  658. ;    How to Run a Script From a Command Line
  659. ;    How to Create and Use a Log File
  660. ;    How to Use a Data File to Call Multiple Host Computers
  661. ;    How to Call a Host Computer
  662. ;    How to Transfer Files
  663. ;    How to Run a Program
  664. ;    How to Pause a Script While a Program Runs
  665. ;    Using "Infinite" Loops
  666. ;
  667. ;
  668. ;    SUBROUTINES
  669. ;    ***********
  670. ;
  671. ;    The following briefly describes the subroutines that are found in this
  672. ;    script:
  673. ;
  674. ;    SUBROUTINE NAME        PURPOSE
  675. ;    ----------------------------------------------------------------------
  676. ;    VARIABLES        Defines variables that will be used.
  677. ;
  678. ;    MAIN                The primary subroutine of the script which
  679. ;                controls other subroutines.
  680. ;
  681. ;    OPEN_FILES        Creates or opens the log file LOG.PCA, the host
  682. ;                data file DATA.PCA, and the sample application
  683. ;                SCRIPT.BAT.
  684. ;
  685. ;    NEXT_HOST          Reads the next host computer to call by reading
  686. ;                the DATA.PCA text file.
  687. ;
  688. ;    CALL_HOST          Calls the next host computer.
  689. ;
  690. ;    TRANSFER_FILE          Transfers the C:\SCRIPT.BAT file from the remote
  691. ;                computer to the host computer's C:\ drive.
  692. ;
  693. ;    RUN_FILE          Runs the SCRIPT.BAT file on the host computer
  694. ;                and branches to the CHECK_FLAG subroutine to
  695. ;                pause the script while it runs.
  696. ;
  697. ;    WRITE_LOG          Writes a text description defined by the calling
  698. ;                subroutine to the log file.
  699. ;
  700. ;    DISPLAY_LOG        If any errors occurred while the script ran,
  701. ;                     displays the log file after the script has
  702. ;                  finished.
  703. ;
  704. ;    CHECK_FLAG          Pauses the script while looking for the flag
  705. ;                file PCA.FLG on the host computer. This file is
  706. ;                created when the SCRIPT.BAT file finishes. When
  707. ;                this file is detected by the script, the script
  708. ;                then continues where it left off.
  709. ;
  710. ;    LOOP            Pauses the script by looping an integer. This
  711. ;                pauses the script for approximately five
  712. ;                seconds.
  713. ;
  714. ;    ERROR              Writes the error number to the log file.
  715. ;
  716. ;    LOST_CONNECTION          Writes information about the lost connection to
  717. ;                the log file.
  718. ;
  719. ;
  720. ;    HOW TO TROUBLESHOOT THIS SCRIPT
  721. ;    *******************************
  722. ;
  723. ;    This script has been extensively tested before being released for
  724. ;    public use. However, other factors could cause issues that would
  725. ;    prevent this script from working correctly. Please check the following
  726. ;    list to ensure that these are correct on your systems:
  727. ;
  728. ;    1. Have you modified the script in any way? Often people will change
  729. ;       something in the script which would then cause it to not work
  730. ;       correctly. This particularly pertains to the file names that the
  731. ;       script uses, such as the LOG.PCA or the SCRIPT.BAT. Do you experience
  732. ;       the same issue if you run the original SAMPLE.SCR file? If not, then
  733. ;       the issue is in your modified version of the script. If so, then you
  734. ;       are most likely experiencing some other type of issue.
  735. ;
  736. ;    2. Did you create the "MODEM" remote control item in the Remote Control
  737. ;       section of your pcANYWHERE remote computer? This item is required by
  738. ;       the script before it is able to dial your host computer correctly.
  739. ;       This process is explained under SETUP AND INSTALLATION at the
  740. ;       beginning of this script.
  741. ;
  742. ;    3. Did you install the script to the pcANYWHERE program directory? This
  743. ;       script may not work correctly if installed to an alternate directory.
  744. ;       This process is explained under SETUP AND INSTALLATION at the
  745. ;       beginning of this script.
  746. ;
  747. ;    4. Do issues exist between the remote and host computers? Is the speed
  748. ;       of the connection slow when connecting manually? Do you receive error
  749. ;       messages or lost connections when connecting manually? If so, you
  750. ;         will need to resolve these issues before continuing trying to use
  751. ;       a script to connect them together.
  752. ;
  753. ;
  754. ;    CHECKING A COMMAND'S RESULTS AFTER IT RUNS - HOW TO USE $RESULT
  755. ;    ***************************************************************
  756. ;
  757. ;    The global variable $RESULT stores the result value of the last script
  758. ;    command to run. $RESULT cannot be manually set by the script, such as
  759. ;    in "$RESULT = 0", but is only set after a command finishes executing.
  760. ;    The value of $RESULT will differ depending on which script command sets
  761. ;    it. For more information on what each script command will set the value
  762. ;    of $RESULT to, please refer to the appropriate script command in the
  763. ;    Creating Scripts book.
  764. ;
  765. ;    Because $RESULT is set by almost every script command, it is
  766. ;    recommended to store the value of $RESULT in a user-defined variable
  767. ;    before trying to check it or return a value from a GoSub...Return loop.
  768. ;    For example, if you need to check $RESULT by using two consecutive
  769. ;    If...Then commands, the first If...Then command will actually set the
  770. ;    value of $RESULT itself, giving the second If...Then command an
  771. ;    incorrect value because it was checking the previous command.
  772. ;
  773. ;    This script uses the user defined variable RES to save the success or
  774. ;    failure status of called subroutines from the MAIN subroutine. The
  775. ;    status could have been passed back to it from the Return command,
  776. ;    however as mentioned above, consecutive If...Then statements will change
  777. ;    the value of $RESULT. Because of this, the status from a called
  778. ;    subroutine is saved to RES, which allows the script to control exactly
  779. ;    what values are saved and checked for. For example:
  780. ;
  781. ;        SessOpr Remote Send "C:\DATA\*.DBF" "C:\NEW\"
  782. ;        RES = $RESULT
  783. ;        If RES <= 4 GoSub @ERROR
  784. ;        If RES > 4 Then @OK
  785. ;    
  786. ;    Please note that the above example is not meant to be run by itself, but
  787. ;    has been provided here as an example on how to set and check $RESULT.
  788. ;    The first line transfers all *.DBF files from the remote's C:\DATA\
  789. ;    directory to the host's C:\NEW\ directory. The second line assigns the
  790. ;    value of $RESULT to the variable RES. The third line checks to see if at
  791. ;    least five of the *.DBF files were sent successfully (four or less); if
  792. ;    not, then the script will branch off to the ERROR subroutine.  The last
  793. ;    line double checks to see if four or more files were sent, if so then
  794. ;    the script goes to the OK subroutine.
  795. ;
  796. ;
  797. ;    CHECKING FOR ERRORS WHEN A SCRIPT RUNS - HOW TO USE $ERROR
  798. ;    **********************************************************
  799. ;
  800. ;    The global variable $ERROR is similar to the $RESULT global variable,
  801. ;    however it is set to the error condition of the last script command to
  802. ;    run, whereas $RESULT is set to the result value of the last script
  803. ;    command to run. If the value of $ERROR is a negative number, then the
  804. ;    script encountered an error. If it is zero, then no errors occurred.
  805. ;    It is important to check $ERROR to ensure that script commands worked
  806. ;    correctly.
  807. ;
  808. ;    Unlike $RESULT which is only set by the last script command, the value
  809. ;    of $ERROR can be set manually by the script. It is recommended to set
  810. ;    $ERROR to zero before running a command and checking it's value. If this
  811. ;    is not done, then $ERROR will retain the last error value that set it;
  812. ;    if a command runs and no errors occur, this does not reset $ERROR to
  813. ;    zero. After the script command runs, check to see if $ERROR is less than
  814. ;    zero; if so, than an error occurred. For example:
  815. ;    
  816. ;        $ERROR = 0
  817. ;        SessOpr Remote Send "C:\AUTOEXEC.BAT" "C:\NEW.BAT"
  818. ;        If $ERROR < 0 GoSub @ERROR
  819. ;
  820. ;    Please note that the above example is not meant to be run by itself,
  821. ;    but has been provided here as an example on how to set and check $ERROR.
  822. ;    The first line resets the value of $ERROR to zero. The second line
  823. ;    transfers the AUTOEXEC.BAT file to the host's new file NEW.BAT. The
  824. ;    third line checks to see if any error occurred; if so, then the script
  825. ;    will branch off to the ERROR subroutine.
  826. ;
  827. ;    This script frequently checks $ERROR. If an error occurs, either a local
  828. ;    subroutine is called, or the ERROR subroutine is called. These
  829. ;    subroutines write the status of the error to the log file then continue
  830. ;    where the script left off.
  831. ;
  832. ;
  833. ;    CHECKING FOR LOST CONNECTIONS - HOW TO USE $DCD
  834. ;    ***********************************************
  835. ;
  836. ;    The global variable $DCD (Data Carrier Detect) is used to check the
  837. ;    status of the connection between the remote and host computers when
  838. ;    modems are used. If you want to connect using a network or direct
  839. ;    connection cable, please refer to the next section called "How to
  840. ;    Use a Network or Cable to Connect to a Host Using a Script". It is
  841. ;    important to check $DCD to ensure that a valid connection exists.
  842. ;    
  843. ;    If the value of $DCD is a one, then the computers are connected. If
  844. ;    it is not equal to one (not necessarily zero), then the computers did
  845. ;    not connect or the connection was dropped (lost connection) while in
  846. ;    a session. Like $RESULT, $DCD cannot be set manually by the script but
  847. ;    is set according to the connection status of the modems.
  848. ;
  849. ;    Important Note for Lost Connections: The value of $DCD is used to check
  850. ;    to see if the remote computer is still connected to the host computer by
  851. ;    modems. However, the value of $DCD may be unreliable because if a lost
  852. ;    connection occurs, the remote computer's modem may take a few moments to
  853. ;    detect and report this. If this is the case, the pcANYWHERE Scripting
  854. ;    Language will be unable to detect the lost connection as well. Different
  855. ;    timing issues on the remote computer that could play a part in this
  856. ;    delay are: the type of modem it uses, the TAPI driver used or it's
  857. ;    initialization string, the speed of the remote computer, and the phone
  858. ;    lines involved. Because of these facts, you may or may not encounter
  859. ;    issues while checking for a lost connection, depending on how the lost
  860. ;    connection occurred. For example, if you drop the connection on the host
  861. ;    computer by unplugging it's phone line, the remote computer will usually
  862. ;    not be able to detect this immediately. However, a lost connection
  863. ;    which occurred due to phone line noise, i.e., a real lost connection not
  864. ;    a simulated one, should be usually detected and accounted for.
  865. ;
  866. ;    It is important to check the value of $DCD before running the following
  867. ;    commands: SessOpr Remote Send and SessOpr Host Send, SessOpr Remote Run
  868. ;    and SessOpr Host Run, and Session End. Also, $DCD should be checked
  869. ;    after a Session Dial command to ensure that a connection was established
  870. ;    correctly. These five commands can only be run from a session started by
  871. ;    the Session Dial command. If they are used and a session is not active,
  872. ;    then several issues may occur, such as: an "AWREM32" error message, a
  873. ;    "Fatal Exception" error message, an "Invalid Script File" error message,
  874. ;    the script hangs, a black Terminal window appears, or script error
  875. ;    messages -23 or -26 appear. Therefore, the value of $DCD needs to be a 1
  876. ;    before running one of these commands; $DCD should be used to check this
  877. ;    before running them. The following is an example on how to check the
  878. ;    value of $DCD before running one of these commands:
  879. ;
  880. ;        If $DCD != 1 GoTo @LOST_CONNECTION
  881. ;        SessOpr Host Send "C:\NEW\*.DOC" "C:\DOCS\"
  882. ;
  883. ;    Please note that the above example is not meant to be run by itself, but
  884. ;    has been provided here as an example on how to set and check $DCD. Also,
  885. ;    $ERROR checking was left out; normally the script should set $ERROR to
  886. ;    zero before running the command, and then check it's value after the
  887. ;    command finishes running. (As outlined in the prior example for $ERROR.)
  888. ;    The first line checks $DCD to see if it is not equal to one; if it is
  889. ;    not, then a lost connection occurred and the script will then branch off
  890. ;    to the LOST_CONNECTION subroutine. The second line transfers the all
  891. ;    *.DOC files in the host computer's C:\NEW\ directory to the remote
  892. ;    computer's C:\DOCS\ directory.
  893. ;
  894. ;    This script frequently checks $DCD. If a lost connection is found,
  895. ;    either a local subroutine is called, or the LOST_CONNECTION subroutine
  896. ;    is called. These subroutines write the status of the lost connection
  897. ;    to the log file then continue where the script left off.
  898. ;
  899. ;
  900. ;    HOW TO USE A NETWORK OR CABLE TO CONNECT TO A HOST USING A SCRIPT
  901. ;    *****************************************************************
  902. ;
  903. ;    The global variable $DCD (Data Carrier Detect) is used to check for the
  904. ;    connection status of modem connections. However, since there is no
  905. ;    $DCD value for a network or cable connection, this variable cannot be
  906. ;    used to check for these types of connections.
  907. ;
  908. ;    If you want to use this sample script to connect to a network or cable
  909. ;    host, then you will need to remove any line that checks for the value
  910. ;    of $DCD. Since $DCD will equal a 0, indicating that no modem connection
  911. ;    is present, even though the remote connected correctly to a network or
  912. ;    cable host, it will immediately detect it as a lost connection and
  913. ;    act accordingly as programmed into this script.
  914. ;
  915. ;    There is no good way to detect whether or not a remote is connected to
  916. ;    a network or direct connect host, however. A direct connect host has
  917. ;    no method to determine if it is connected, other than trying to transfer
  918. ;    a test file to it to see if the connection is valid. This may cause the
  919. ;    script or remote to hang, since the SessOpr Remote Send command should
  920. ;    only be used in a valid remote control session. Therefore, this is not
  921. ;    a good work around, but is the only one that is known.
  922. ;
  923. ;    For a network connection, a better work around is to have the script run
  924. ;    a batch file to copy a file to a network drive, and then use the IF EXIST
  925. ;    batch file command to see if the file was successfully sent. If so, the
  926. ;    batch file could create a dummy flag file that the script waits to find.
  927. ;    If the script finds this file, then it can assume that the network
  928. ;    connection has been successful and then continue the script.
  929. ;
  930. ;
  931. ;    HOW TO CONVERT AN INTEGER TO A STRING VARIABLE
  932. ;    **********************************************
  933. ;
  934. ;    Variable conversion is a straightforward process in the pcANYWHERE
  935. ;    Scripting Language. Just assign the string variable to the integer
  936. ;    variable, and the conversion is complete.
  937. ;
  938. ;    It may be more difficult to convert a string to an integer however.
  939. ;    The string cannot contain any letters or special characters, otherwise
  940. ;    the conversion cannot take place. The following are some examples of
  941. ;    performing both types of conversions:
  942. ;
  943. ;        String X[5]
  944. ;        Integer Y
  945. ;        Y = 5
  946. ;        X = Y        ; Assigns the value of Y, 5, to the string X.
  947. ;        X = "6"
  948. ;        Y = X        ; Assigns the value of X, 6, to the integer Y.
  949. ;
  950. ;
  951. ;    HOW TO SCHEDULE A SCRIPT USING A THIRD PARTY SCHEDULER
  952. ;    ******************************************************
  953. ;
  954. ;    The recommended method to schedule a script to run at a later date
  955. ;    and time is to use a third party scheduler, such as the one
  956. ;    supplied with Norton AntiVirus. The scheduler would run the script by
  957. ;    using the pcANYWHERE command line syntax. Please refer to the section
  958. ;    "How to Run a Script from a Command Line" for more information.
  959. ;
  960. ;
  961. ;    HOW TO PROGRAM A SCRIPT TO SCHEDULE ITSELF
  962. ;    ******************************************
  963. ;
  964. ;    If you do not have a third party scheduler, then you can use either the
  965. ;    Wait Until or Session Dial commands to "schedule" your script for you.
  966. ;    Both of these commands can use optional date and time parameters to
  967. ;    suspend script operations until the date and time that you specify. For
  968. ;    example:
  969. ;
  970. ;        Wait Until 2359 19991221
  971. ;
  972. ;    The Wait Until command will pause the script from continuing until
  973. ;    11:59 PM on December 21st, 1999. (This will only work if the remote
  974. ;    pcANYWHERE is pcAnywhere 9.0 or pcANYWHERE32 8.0. All other versions
  975. ;       only use the last two digits of the year instead of four digits.) Both
  976. ;    the Wait Until and Session Dial commands use a 24-hour time format, so
  977. ;    11:59 PM becomes 2359.
  978. ;
  979. ;    You can run the script any time before the target time, such as when you
  980. ;    go home from work for the day. The script will respond with a black
  981. ;    terminal window, which is what the script looks like while it is
  982. ;    waiting to begin execution. (This window can be minimized if the
  983. ;    remote computer is running Windows so that you can continue working on
  984. ;    the remote computer.) Once the time is reached, the script then begins
  985. ;    it's normal execution.
  986. ;
  987. ;    A disabled Wait Until command is available for you to use at the
  988. ;    beginning of the MAIN subroutine.
  989. ;
  990. ;    Additional information about using the Wait command can be found in the
  991. ;    NOTE 1 section of the MAIN subroutine.
  992. ;
  993. ;
  994. ;    HOW TO RUN A SCRIPT FROM A COMMAND LINE
  995. ;    ***************************************
  996. ;
  997. ;    Each version of pcANYWHERE requires a different command line:
  998. ;
  999. ;    pcAnywhere 9.0 and pcANYWHERE32 8.0: AWREM32.EXE <script name>.SCR
  1000. ;    C:\PROGRAM FILES\SYMANTEC\PCANYWHERE\AWREM32.EXE C:\SCRIPTS\SAMPLE.SCR
  1001. ;
  1002. ;    pcANYWHERE 2.0:    WINAW.EXE -O=R -M=S -N=<script name>.SCR
  1003. ;    C:\WINAW\WINAW.EXE -O:R -M:S -N:C:\SCRIPTS\SAMPLE.SCR
  1004. ;
  1005. ;    pcANYWHERE 5.0:    AW.EXE /O:S /M:S /N:<script name>.SCR
  1006. ;    C:\AW\AW.EXE /O:S /M:S /N:C:\SCRIPTS\SAMPLE.SCR
  1007. ;
  1008. ;    Please note that the above examples must include full path names to the
  1009. ;    executable file and the script file. Also, if the path name is longer
  1010. ;    than eight characters or has spaces, you may need to enclose the path
  1011. ;    name in quotation marks:
  1012. ;
  1013. ;    "C:\PROGRAM FILES\SYMANTEC\PCANYWHERE\AWREM32.EXE" C:\SCRIPTS\SAMPLE.SCR
  1014. ;
  1015. ;    
  1016. ;    HOW TO CREATE AND USE A LOG FILE
  1017. ;    ********************************
  1018. ;
  1019. ;    A log file can be created that will record the success or failure of
  1020. ;    specific procedures when the script runs. The values of $ERROR or $DCD
  1021. ;    can be checked by other subroutines in the script, and when an error
  1022. ;    occurs, logged into the log file.
  1023. ;
  1024. ;    This script creates a log file called LOG.PCA. Each entry in the log
  1025. ;    file includes the date and time that they were made, which is performed
  1026. ;    by the WRITE_LOG subroutine.
  1027. ;
  1028. ;    The log file is stored in the pcANYWHERE program directory. To view this
  1029. ;    log file, use any text editor or word processor. The last script session
  1030. ;    to run is added to the bottom of the log file information.
  1031. ;    
  1032. ;    Please refer to the OPEN_FILES and WRITE_LOG subroutines to learn how to
  1033. ;    create and write to a log file respectively.
  1034. ;
  1035. ;    Please note that a log file's scope is to save success or failure
  1036. ;    information on procedures that the script performs. Events that occur
  1037. ;    outside of the pcANYWHERE Scripting Language, such as the remote
  1038. ;    computer hanging while a script runs, it beyond the script's ability to
  1039. ;    detect and account for.
  1040. ;
  1041. ;    Troubleshooting note: if the script hangs or is terminated while it is
  1042. ;    running, the log file may remain open and you may not be able to run the
  1043. ;    script again without getting an error, or be able to view the log file.
  1044. ;    If so, close pcANYWHERE and then load pcANYWHERE again. If you still
  1045. ;    cannot run the script or view the log file, you will need to reboot the
  1046. ;    remote computer.
  1047. ;
  1048. ;    The following is an example of a log file generated by this script:
  1049. ;
  1050. ; **** pcANYWHERE Script Log File ****
  1051. ; 12/22/97 13:47:45   Starting script.
  1052. ; 12/22/97 13:47:45   Calling host 'MODEM'.
  1053. ; 12/22/97 13:48:17   Successfully connected to host 'MODEM'.
  1054. ; 12/22/97 13:48:20   Transfer of 'C:\SCRIPT.BAT' was successful.
  1055. ; 12/22/97 13:48:23   Executing 'C:\SCRIPT.BAT' on the host...
  1056. ; 12/22/97 13:48:26   Execution of 'C:\SCRIPT.BAT' on the host was successful.
  1057. ; 12/22/97 13:48:26   Disconnecting from host 'MODEM'.
  1058. ; 12/22/97 13:48:33   Calling host 'MODEM'.
  1059. ; 12/22/97 13:49:04   Successfully connected to host 'MODEM'.
  1060. ; 12/22/97 13:49:06   Transfer of 'C:\SCRIPT.BAT' was successful.
  1061. ; 12/22/97 13:49:08   Executing 'C:\SCRIPT.BAT' on the host...
  1062. ; 12/22/97 13:49:12   Execution of 'C:\SCRIPT.BAT' on the host was successful.
  1063. ; 12/22/97 13:49:12   Disconnecting from host 'MODEM'.
  1064. ; 12/22/97 13:49:19   Script completed with 0 error(s).
  1065. ;
  1066. ;
  1067. ;    HOW TO USE A DATA FILE TO CALL MULTIPLE HOST COMPUTERS
  1068. ;    ******************************************************
  1069. ;
  1070. ;    A script can use a text data file to call multiple host computers. This
  1071. ;    can save you from having to create repetitive blocks of code and allow
  1072. ;    you to use the same set of code for each host computer.
  1073. ;
  1074. ;    This script creates it's own data file, the DATA.PCA file. However, the
  1075. ;    remote user would normally create this on their own in the pcANYWHERE
  1076. ;    program directory by using a text editor or word processor. This file
  1077. ;    must be saved as a standard text file.
  1078. ;
  1079. ;    Each line in the data file corresponds to a remote control item of the
  1080. ;    same name. Each of the remote control items in pcANYWHERE requires the
  1081. ;    host computer's phone number, and any logon name or password that may
  1082. ;    also be required. It is not possible to use a list of phone numbers
  1083. ;    instead of a list of host names: the pcANYWHERE Scripting Language
  1084. ;    cannot call a host computer using a phone number but requires a remote
  1085. ;    control item for each host computer that has it's phone number specified
  1086. ;    in it's properties.
  1087. ;
  1088. ;    The DATA.PCA file that this script creates will call the same host
  1089. ;    MODEM twice, and will look like this:
  1090. ;
  1091. ;        MODEM
  1092. ;        MODEM
  1093. ;
  1094. ;    If certain hosts failed to connect or failed in their operations while
  1095. ;    connected to the remote, a specialized DATA.PCA file can be made with
  1096. ;    only the names of the ones to be recalled after the main script has run.
  1097. ;    This is done manually by the remote user. Just create a new DATA.PCA
  1098. ;    file, renaming the old one temporarily, with only the host names to call
  1099. ;    back. After these complete you can then delete the temporary DATA.PCA
  1100. ;    file and rename the original.
  1101. ;
  1102. ;    Troubleshooting note: if you misspell a host computer name in your data
  1103. ;    file, or the host computer name does not exist in the remote control
  1104. ;    section of the remote computer's pcANYWHERE, the error message "File
  1105. ;    Not Found" will appear and the script may end abruptly. If this occurs,
  1106. ;    double check that you have spelled the host computer names correctly and
  1107. ;    that remote control items exist.
  1108. ;
  1109. ;    For information on how to read the data file, please refer to the
  1110. ;    NEXT_HOST subroutine. This subroutine reads the next host to call from
  1111. ;    the data file and assign's it's value to the user-defined HOST variable.
  1112. ;
  1113. ;       
  1114. ;    HOW TO CALL A HOST COMPUTER
  1115. ;    ***************************
  1116. ;
  1117. ;    The only command that can be used to call a host computer is the Session
  1118. ;    Dial command. This command calls the host computer using a pcANYWHERE
  1119. ;    remote control item that has the host computer's phone number, and any
  1120. ;    logon or password information already configured in it's properties.
  1121. ;
  1122. ;    This script uses the subroutine CALL_HOST to call the host computers.
  1123. ;    This subroutine also configures other options for the connection, such
  1124. ;    as the retry value if the connection could not be established. Please
  1125. ;    refer to the CALL_HOST subroutine for more information.
  1126. ;
  1127. ;    Several important notes on calling a host computer with a script are
  1128. ;    listed below:
  1129. ;
  1130. ;    * When connected to a host computer, only specific script commands are
  1131. ;      supported. These include the SessOpr Remote Send, SessOpr Remote Run,
  1132. ;      SessOpr Host Send, SessOpr Host Run and Session End. While other
  1133. ;      commands can be used, they may introduce issues. Also, some script
  1134. ;      commands are designed to be used with online services only, such as
  1135. ;      the Send File and Receive File commands. These type of commands
  1136. ;      should not be used while connected to a host computer.
  1137. ;
  1138. ;    * The session is non-interactive. If the host computer is in use when
  1139. ;      the script calls into it, issues may occur. If you attempt to use the
  1140. ;      host computer remotely while the script runs, issues may occur.
  1141. ;
  1142. ;    * A script cannot interact with a program, nor send text or keystrokes
  1143. ;      to a program. This includes sending keystrokes to data fields, such as
  1144. ;      logon prompts for a network or email program. This is because a script
  1145. ;      cannot set focus on a window or a field so that it can send the text
  1146. ;      to it.
  1147. ;
  1148. ;    * If a connection to a host cannot be established, pcANYWHERE will take
  1149. ;      over and pause until returning control to the script. For example,
  1150. ;      pcANYWHERE will first display "Waiting for Connection" while it is
  1151. ;      trying to call the host computer. After it fails, it will display
  1152. ;      "Timeout Waiting for Connection". Both of these windows will stay on
  1153. ;      the screen for one minute each. Then control will return to the
  1154. ;      script, which is set to wait an additional minute before calling the
  1155. ;      same host back, which it will do three times.
  1156. ;
  1157. ;    
  1158. ;    HOW TO TRANSFER FILES
  1159. ;    *********************
  1160. ;
  1161. ;    Files can be transferred between the remote and host computers by using
  1162. ;    a script. This is performed by the SessOpr Remote Send and the SessOpr
  1163. ;    Host Send commands respectively. (The Send File and Receive File
  1164. ;    commands are only used when connected to an online service.)
  1165. ;
  1166. ;    This script uses the TRANSFER_FILE subroutine to transfer a single file
  1167. ;    from the remote computer to the host computer. In addition to this, the
  1168. ;    source file name is defined by the user-defined SOURCE variable. By
  1169. ;    using a variable, a more robust method for logging the result of
  1170. ;    multiple file transfers can be used instead of creating specific log
  1171. ;    entries. (This script does not use this feature since it only transfers
  1172. ;    one file. However if you have multiple file transfers that take place,
  1173. ;    extra code would not need to be created to record the file transfer's
  1174. ;    results to the log file with the file name that was transferred.)
  1175. ;
  1176. ;    Please refer to the FILE_TRANSFER subroutine for more information. Also,
  1177. ;    for more information on how to perform file transfers, please refer to
  1178. ;    the Symantec Knowledge Base article called "How to Transfer Files to or
  1179. ;    From a Host Computer".
  1180. ;    
  1181. ;    If you are using pcAnywhere 9.0 or pcANYWHERE32 8.0 you will need to add
  1182. ;     a GoSub @LOOP after each file transfer routine.  File transfers will
  1183. ;    proceed best if you use a separate routine for each file transfer such
  1184. ;    as:
  1185. ;    
  1186. ;    
  1187. ;    @TRANSFER_FILE:               
  1188. ;      SOURCE = "<path><file name>"          
  1189. ;      If $DCD != 1 GoTo @TRANSFER_FILE_LOST 
  1190. ;      $ERROR = 0                 
  1191. ;      SessOpr Remote Send SOURCE "<path><file name>"  
  1192. ;      ERR = $ERROR                 
  1193. ;      If $ERROR < 0 GoTo @TRANSFER_FILE_ERROR  
  1194. ;      LOG = "Transfer of '"             
  1195. ;      StrCat LOG SOURCE             
  1196. ;      LOG2 = "' was successful."         
  1197. ;      StrCat LOG LOG2             
  1198. ;      GoSub @WRITE_LOG             
  1199. ;      RES = 0                 
  1200. ;      GoSub @LOOP                 
  1201. ;                         
  1202. ;    @TRANSFER_FILE1:               
  1203. ;      SOURCE = "<path><file name>"          
  1204. ;      If $DCD != 1 GoTo @TRANSFER_FILE_LOST 
  1205. ;      $ERROR = 0                 
  1206. ;      SessOpr Remote Send SOURCE "<path><file name>"  
  1207. ;      ERR = $ERROR                 
  1208. ;      If $ERROR < 0 GoTo @TRANSFER_FILE_ERROR  
  1209. ;      LOG = "Transfer of '"             
  1210. ;      StrCat LOG SOURCE             
  1211. ;      LOG2 = "' was successful."         
  1212. ;      StrCat LOG LOG2             
  1213. ;      GoSub @WRITE_LOG             
  1214. ;      RES = 0                 
  1215. ;      GoSub @LOOP    
  1216. ;             
  1217. ;      Return            ;Return to main routine at the end of the last
  1218. ;                    ;file transfer routine        
  1219. ;
  1220. ;
  1221. ;    Please note that the above example is not meant to be run by itself, but
  1222. ;    has been provided here as an example on how to transfer multiple files with 
  1223. ;     a script.       
  1224. ;
  1225. ;
  1226. ;    HOW TO RUN A PROGRAM
  1227. ;    ********************
  1228. ;
  1229. ;    A program can be run on the remote or host computer while in a session.
  1230. ;    However, if the program is run on a Windows-based computer, the script
  1231. ;    cannot tell when it has finished running. If the script needs to tell
  1232. ;    when the program finishes, a special method of detecting this may need
  1233. ;    to be used. Please refer to the section below called "How to Pause a
  1234. ;    Script While a Program Runs" for more information.
  1235. ;
  1236. ;    A script can use three different commands to run a program:
  1237. ;
  1238. ;    * SessOpr Remote Run, to run a program on the remote computer while in a
  1239. ;      session.
  1240. ;
  1241. ;    * SessOpr Host Run, to run a program on the host computer while in a
  1242. ;      session.
  1243. ;
  1244. ;    * Run, to run a program on the remote computer while not in a session.
  1245. ;
  1246. ;    All three of these function basically the same, with the exception that
  1247. ;    the two SessOpr commands cannot be run outside of a session.
  1248. ;
  1249. ;    It is recommended to specify the full path name of the program to run.
  1250. ;    Also, if it is DOS-based, you may need to specify the command
  1251. ;    interpreter as well. For example, the following command runs the
  1252. ;    MS-DOS EDIT command:
  1253. ;
  1254. ;        Run "COMMAND.COM /C C:\DOS\EDIT.COM"
  1255. ;
  1256. ;    The "COMMAND.COM /C" is the command interpreter. The "/C" switch for the
  1257. ;    command interpreter tells the window to close after it has finished (if
  1258. ;    the command was run from within Windows). Otherwise, the DOS window will
  1259. ;    stay open and the user will need to close it manually.
  1260. ;
  1261. ;    Windows NT must use the START command to run DOS programs, otherwise
  1262. ;    control will not be returned. This is the same as using the "/C", but is
  1263. ;    required for Windows NT.
  1264. ;
  1265. ;
  1266. ;    HOW TO PAUSE A SCRIPT WHILE A PROGRAM RUNS
  1267. ;    ******************************************
  1268. ;
  1269. ;    If a script runs a program on a Windows-based computer, it cannot detect
  1270. ;    when the program finishes. If the script is required to pause while the
  1271. ;    program runs, this can be an issue. The reason a script cannot detect
  1272. ;    when a program finishes is because Windows is a multitasking operating
  1273. ;    system. The script will run the program, but as a separate task in a
  1274. ;    window. The script has no control over this window and cannot detect
  1275. ;    when it closes.
  1276. ;
  1277. ;    Several methods are available which allow a script to pause while a
  1278. ;    program runs, however most are not reliable. The Wait command can pause
  1279. ;    a script, however it is not recommended to use this command while a
  1280. ;    session is active. If a lost connection occurs while the Wait command is
  1281. ;    being used, the remote computer may hang or the script may encounter
  1282. ;    errors. The SessOpr Remote Run and SessOpr Host Run commands using the
  1283. ;    optional Wait parameter only work if the application is run on a DOS-
  1284. ;    based computer. (Not a DOS window run from within Windows.) To correctly
  1285. ;    pause a script while a program runs, a special procedure will need to be
  1286. ;    used.
  1287. ;
  1288. ;    One procedure of pausing a script is to create a loop that uses computer
  1289. ;    cycles, such as incrementing an integer variable. This script uses this
  1290. ;    procedure (the LOOP subroutine) for creating short pauses. However, this
  1291. ;    process is not accurate enough to be used if the script needs to know
  1292. ;    exactly when a program is finished.
  1293. ;
  1294. ;    The best procedure that can pause a script while a program runs is
  1295. ;    described below, which uses a flag file to detect when the program has
  1296. ;    finished running:
  1297. ;
  1298. ;    Step 1. The script runs the program.
  1299. ;
  1300. ;    Step 2. The script goes into a loop where it tries to detect the
  1301. ;        existence of a flag file which is created by the program when
  1302. ;        it finishes. If it cannot find the file, then it continues to
  1303. ;        search until it is found or a set number of searches have been
  1304. ;        completed.
  1305. ;
  1306. ;    Step 3. After the script detects the flag file, it then continues where
  1307. ;         it left off.
  1308. ;
  1309. ;    This script uses the CHECK_FLAG subroutine to perform this procedure.
  1310. ;    The following is an excerpt from the CHECK_FLAG subroutine:
  1311. ;
  1312. ; @CHECK_FLAG:                 ; Subroutine used to pause the script.
  1313. ;   LOOP = 0                 ; Reset the value of LOOP to 0.
  1314. ;
  1315. ; @CHECK_FLAG_FILE:             ; Subroutine used find flag file.
  1316. ;   GoSub @LOOP                 ; Pause script for five seconds.
  1317. ;   LOOP = LOOP + 1             ; Increment the value of LOOP.
  1318. ;   If LOOP == 24 GoTo @CHECK_FLAG_ERROR  ; If LOOP takes too long, abort.
  1319. ;   If $DCD != 1 GoTo @CHECK_FLAG_LOST  ; If lost connection, end loop.
  1320. ;   $ERROR = 0                 ; Reset the value of $ERROR to 0.
  1321. ;   SessOpr Host Send "C:\PCA.FLG" "C:\PCA.FLG"  ; Attempt file transfer.
  1322. ;   If $ERROR == -8 GoTo @CHECK_FLAG_FILE  ; If file not found, loop.
  1323. ;   If $ERROR < 0 GoTo @CHECK_FLAG_OTHER  ; If other error, end loop.
  1324. ;
  1325. ;    The @CHECK_FLAG subroutine has a single line. This resets the value of
  1326. ;    the user-defined LOOP variable to a zero. The LOOP variable is
  1327. ;    discussed in more detail below.
  1328. ;
  1329. ;    The @CHECK_FLAG_FILE subroutine is where the actual check for the
  1330. ;    existence of the flag file occurs at. The command lines for this
  1331. ;    excerpt are described below:
  1332. ;
  1333. ;    1. GoSub @LOOP. This pauses the script for approximately five seconds
  1334. ;       by branching to the LOOP subroutine. This is important to use
  1335. ;       because otherwise the script will loop too quickly while checking
  1336. ;       for the flag file and could result in memory issues on the remote
  1337. ;       computer.
  1338. ;
  1339. ;    2. LOOP = LOOP + 1. This increments the LOOP variable by one. When the
  1340. ;       script loops too many times, the CHECK_FLAG subroutine will
  1341. ;       automatically timeout, as described below.
  1342. ;
  1343. ;    3. If LOOP == 24 GoTo @CHECK_FLAG_ERROR. If the CHECK_FLAG_FILE
  1344. ;       subroutine has looped twenty-four times, about two minutes, abort
  1345. ;       the subroutine because an error may have occurred that is preventing
  1346. ;       the flag file from being detected. If this check does not occur, the
  1347. ;       script may hang and go into an infinite loop. By changing the number
  1348. ;       24 to a larger or smaller number, the script will wait a longer or
  1349. ;       shorter amount of time. This is based on a five second pause when the
  1350. ;       script branches to the LOOP subroutine times the number that it
  1351. ;       checks here; 24 times 5 seconds is two minutes.
  1352. ;
  1353. ;    4. The connection status of the modems is checked. If the remote
  1354. ;       computer is no longer connected to the host computer, the subroutine
  1355. ;       is aborted.
  1356. ;
  1357. ;    5. The value of $ERROR is reset to zero before trying to detect the flag
  1358. ;       file by file transferring it to the remote computer.
  1359. ;
  1360. ;    6. The script attempts to transfer the flag file PCA.FLG from the host
  1361. ;       computer to the remote computer.
  1362. ;
  1363. ;    7. If the file was not found (error -8), then the subroutine loops back
  1364. ;       to the beginning and continues until it is able to transfer the file
  1365. ;       or the LOOP variable times out.
  1366. ;
  1367. ;    8. If any other error occurred, the script aborts.
  1368. ;
  1369. ;    This script uses the flag file PCA.FLG. Since this file will at some
  1370. ;    point exist on both the remote and host computers, it needs to be
  1371. ;    deleted before the CHECK_FLAG subroutine runs. Otherwise, the
  1372. ;    CHECK_FLAG subroutine will detect it on the host computer, and assume
  1373. ;    that the program is finished running. The RUN_FILE subroutine is used
  1374. ;    to delete the PCA.FLG files on both the remote and host computers
  1375. ;    before it runs the sample application SCRIPT.BAT file on the host
  1376. ;    computer, then it branches to the CHECK_FLAG subroutine until the
  1377. ;    real PCA.FLG file has been detected.
  1378. ;
  1379. ;    The SCRIPT.BAT file creates the PCA.FLG file when it finishes. All that
  1380. ;    this file does is the following:
  1381. ;
  1382. ;        @ECHO OFF
  1383. ;        C:
  1384. ;        CD \
  1385. ;        DIR /A
  1386. ;        DIR >PCA.FLG
  1387. ;
  1388. ;    The first line sets the echo off for output from any following commands.
  1389. ;    The second line changes to the C: drive. The third line changes to the
  1390. ;    root drive of the C: drive. The fourth line then displays the directory
  1391. ;    of the C: root directory and all files found in it. After it finishes,
  1392. ;    it creates the dummy file PCA.FLG by piping the contents of the
  1393. ;    directory to the file name by using a DIR command.
  1394. ;
  1395. ;    A batch file only needs the following three lines of code to create the
  1396. ;    flag file:
  1397. ;
  1398. ;        C:
  1399. ;        CD \
  1400. ;        DIR >PCA.FLG
  1401. ;
  1402. ;    The CHECK_FLAG subroutine requires a batch file to be used so that it
  1403. ;    can then create the flag file after it has finished with it's normal
  1404. ;    operations. However, if you have the ability to create a Visual BASIC
  1405. ;    or other executable application, it can also be used so long as when it
  1406. ;    finishes, it creates the flag file. However, it is up to you to create
  1407. ;    your own batch file or executable application.
  1408. ;
  1409. ;
  1410. ;    USING "INFINITE" LOOPS
  1411. ;    **********************
  1412. ;    
  1413. ;    Using a subroutine that loops an "infinite" amount of times (over and
  1414. ;    over again), or loops so many times that it takes a long period of time
  1415. ;    to complete, is not usually recommended. Such infinite loops are very
  1416. ;    likely to cause issues on the remote computer, such as causing the
  1417. ;    script to hang, or cause an Unexpected program error message.
  1418. ;
  1419. ;    If you need a subroutine to perform an infinite loop, there are two
  1420. ;    things which you can do to minimize how many issues may occur. This
  1421. ;    includes using a check variable that stops the loop if it's value
  1422. ;    is exceeded, and using a sub-loop to pause the looping for a short
  1423. ;    period of time to allow the remote to process other computer cycles.
  1424. ;
  1425. ;    The CHECK_FLAG subroutine in this script uses the LOOP variable as
  1426. ;    a check variable. Each time the subroutine loops, the check variable
  1427. ;    is incremented by one. Once this variable is 24 or more, the script
  1428. ;    then assumes an error has occurred and aborts the loop.
  1429. ;
  1430. ;    The CHECK_FLAG subroutine also uses a sub-loop to pause it from
  1431. ;    continually looping without delay. At the beginning of the subroutine,
  1432. ;    the LOOP subroutine is called. This subroutine also performs loops,
  1433. ;    but does so very quickly by incrementing a variable 40,000 times to
  1434. ;    simulate approximately a five second delay. After this loop finishes,
  1435. ;    control returns to the CHECK_FLAG subroutine.
  1436.