首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将我的Rexx程序作为批处理作业运行?

如何将我的Rexx程序作为批处理作业运行?
EN

Stack Overflow用户
提问于 2016-08-10 07:48:29
回答 3查看 10K关注 0票数 2

我有一个Rexx程序,我想作为一个批处理作业运行。我该怎么做?

这是我的节目:-

代码语言:javascript
复制
/* Rexx – HELLO – Write Hello World */
Say "hello World"

该程序位于PDS ME.USER.EXEC中的成员ME.USER.EXEC中。

我安装的有效工作卡是(我们的环境包括ISPF/PDF,而不是ROSCOE):-

代码语言:javascript
复制
//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID

注意!这已经写成了一个教程。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-10 08:17:42

有许多方法可以通过批处理运行程序。我将介绍三种方式,所有这些都是不同的环境(即,他们可以利用)。

方法1-在Rexx环境中运行程序.

这需要运行程序IRXJCL,并通过字段传递程序名称(即PDS的成员名称)(您也可以传递参数;通过解析ARG语句访问参数)。

IRXJCL需要(通常)3 DDNAMES --它们是SYSEXEC (程序所在的PDS )、SYSTSIN (这可以反映终端输入)和SYSTSPRTE 215>(这是发送终端输出的位置)。

下面是根据上面提供的信息工作的JCL:

代码语言:javascript
复制
//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG  EXEC PGM=IRXJCL,PARM=’HELLO’
//*
//*        RUN OUR REXX PROGRAM CALLED HELLO
//*
//SYSEXEC  DD DSN=ME.USER.EXEC,DISP=SHR
//SYSTSIN  DD DUMMY
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------

这种方法虽然是最简单的(只使用几行JCL),但限制最大,因为它不允许使用TSO/E服务,例如TSO/E命令和大多数TSO/E外部函数。 但是,由于IRXJCL是Rexx处理器,因此不需要让TSO/E知道它是Rexx程序(第一行必须包括REXX)。

方法2-从TSO/E环境运行程序

这需要运行一个TSO/E批处理程序,在本例中使用IKJEFT01。替代方案有IKJEFT1A和IKJEFT1B。TSO/E服务和命令可以通过这种方法使用(例如,在此方法的末尾使用时间命令)

关于这些程序之间差异的全面信息可以在Writing JCL for command execution上找到。

用于IKJEFT01的JCL与方法1中使用的JCL类似,可以编写额外的DDNAME SYSPROC。 SYSPROC 是CLISTS所在的DDNAME;除了SYSEXEC之外,您还可以在这里找到Rexx程序(这不是必需的,建议两者都被编码,SYSEXEC用于Rexx程序,SYSPROC用于CLISTS)。

这是Rexx在第一行的要求,它将Rexx程序与CLIST (由TSO/E处理器)区分开来。因此,如果通过SYSEXEC找到/定位了Rexx程序,如果我没有记错,这就否定了需求)。 另一个建议是总是在REXX program>的第一行中包含Rexx。

EXEC语句调用IKJEFT01程序,而不是IRXJCL。PARM可用于指定第一个命令(因此也是我们的HELLO程序)。但是,对于前台,您可以通过终端(即SYSTSIN DDNAME )指定这一点。

下面是一些适用于第二种方法的JCL;注意到Hello程序是通过SYSTSIN DDNAME作为instream数据调用的:-

代码语言:javascript
复制
//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG  EXEC PGM=IKJEFT01
//*
//*        RUN OUR REXX PROGRAM CALLED HELLO IN A TSO/E ENVIRONMENT
//*
//SYSPROC  DD DSN=ME.USER.CLIST,DISP=SHR
//SYSEXEC  DD DSN=ME.USER.EXEC,DISP=SHR
//SYSTSIN  DD *
 HELLO
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------

例如,如果使用以下内容(即将时间作为SYSTSIN的另一行添加),则将运行TSO/E TIME命令(这将导致将时间显示给SYSTSPRT)。 //SYSTSIN DD *你好时间

方法3-在ISPF环境中运行程序。

该方法使用IKJEFT01程序( IKJEFT1A/B备选方案见方法2)。但是,它随后使用ISPSTART命令在 ISPF 环境中运行程序;启用使用ISPF服务(例如文件裁剪(骨架)ISPF表等)。

ISPF环境有更多的要求,因为为了启动ISPF环境,需要分配ISPF库。所提供的ISPF库至少分配给ISPPLIB (ISPF面板)、ISPMLIB (ISPF消息)和ISPTLIB (ISPF表)。ISPPROF是ISPF为会话保存一些配置文件数据的地方,因此临时存储就足够了(如果不是总是可用的话,UNIT=SYSDA通常是可用的)。

注意,您可能至少会分配安装系统库(可以使用TSO/E命令LISTA从前台会话确定这些库)。或者,询问本地友好的系统程序员。下面是SYS1.ISPPLIB、SYS1.ISPMLIB和SYS1.ISPTLIB。

下面是一些适用于第三种方法的JCL。注意,HELLO作为参数传递给ISPSTART命令。

代码语言:javascript
复制
//MYJOB    JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
//*-------------------------------------------------------------------
//RUNPROG  EXEC PGM=IKJEFT01
//*
//*        RUN OUR REXX PROGRAM HELLO IN A TSO/E/ISPF ENVIRONMENT
//*
//SYSPROC  DD DSN=ME.USER.CLIST,DISP=SHR
//SYSEXEC  DD DSN=ME.USER.EXEC,DISP=SHR
//ISPPLIB  DD DSN=SYS1.ISPPLIB,DISP=SHR
//ISPMLIB  DD DSN=SYS1.ISPMLIB,DISP=SHR
//ISPTLIB  DD DSN=SYS1.ISPTLIB,DISP=SHR
//ISPPROF  DD UNIT=SYSDA,SPACE=(CYL,(10,1)),
//            RECFM=FB,LRECL=80,BLKSIZE=0
//SYSTSIN  DD *
 ISPSTART CMD(HELLO)
//SYSTSPRT DD SYSOUT=*
//*-------------------------------------------------------------------

注意,这不是一个全面的概述,应该足以开始批量运行Rexx程序。

票数 8
EN

Stack Overflow用户

发布于 2016-08-10 15:34:59

对上述答复的补充评论。如果您希望使用ISPF服务运行REXX exec,下面的technote可能会有所帮助.

http://www.ibm.com/support/docview.wss?uid=swg21023990

确保ISPPROF文件作为ISPTLIB中的第一个文件连接。该示例使用一个临时文件,该文件将是作业的唯一文件。如果REXX执行表服务,您可能需要一个ISPTABL。我建议对ISPPROF和ISPTABL使用相同的文件,并在ISPTLIB中首先连接它。如果需要保存表,这可以是一个永久文件,但是其他作业或TSO用户不应该使用它,以避免队列错误。

正如上一次更新所述,他的答案对于简单的REXX主管来说已经足够了。

票数 2
EN

Stack Overflow用户

发布于 2016-11-21 07:45:53

对MikeT的回答还有更多的评论.

假设您希望您的JCL是独立的:您希望在JCL中包含一个REXX exec作为流中的数据集,而不是引用存储在PDS成员中的REXX exec。

下面是“技巧”(对于IRXJCL;我还没有在其他程序中测试这个技巧):指定一个null (X'00')字节作为EXEC语句的EXEC属性的值。

若要指定空字节,请使用z/OS编辑器和HEX ON

代码语言:javascript
复制
//REXX     EXEC PGM=IRXJCL,PARM=' '
66DCEE44444CECC4DCD7CDEDCD6DCDD7707
1195770000057530774E997133B7194ED0D

例如,如果输入以空格作为值的PARM=' ',则用0覆盖该空格的十六进制值的4

下面是一个包含流内REXX exec的示例作业步骤,它处理同一作业中前一步的输出:

代码语言:javascript
复制
//* PARM value is a single X'00' byte                          
//REXX     EXEC PGM=IRXJCL,PARM=' '                            
//SYSEXEC  DD   DATA,DLM=$$                                    
/*                                                             
   Transposes first line of input CSV into one record per field
   Reads CSV from ddname SYSTSIN.                              

   Writes output to ddname SYSTSPRT.                           
*/                                                             
columnSeparator = ","                                          

/* Get the header row */                                       
parse pull row                                                 
/* Get column names */                                         
do i = 1 until row = ""                                        
  parse value row with columnName "," row                      
  say columnName                                               
end                                                            
exit 0                           
$$                               
//SYSTSIN  DD  DSN=&&CSV,DISP=OLD
//SYSTSPRT DD  SYSOUT=*          

备注:

  • 在这种情况下,REXX exec的第一行不需要包含字符串"REXX“。
  • DLM=$$使您可以使用REXX注释语法(/*),而无需过早结束流内数据集。
  • &&CSV指由前一个作业步骤创建的CSV文件(未显示)

我使用这种“流中的REXX”技术,主要是为临时执行人员将批处理程序的输出转换为我真正想要的。这种技术对于演示和快速跳过想法很有用;其他开发人员可以在SDSF输出中就地查看JCL中的REXX代码,对其进行调整,然后提交经过调整的版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38867243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档