我有一个Rexx程序,我想作为一个批处理作业运行。我该怎么做?
这是我的节目:-
/* Rexx – HELLO – Write Hello World */
Say "hello World"该程序位于PDS ME.USER.EXEC中的成员ME.USER.EXEC中。
我安装的有效工作卡是(我们的环境包括ISPF/PDF,而不是ROSCOE):-
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID注意!这已经写成了一个教程。
发布于 2016-08-10 08:17:42
有许多方法可以通过批处理运行程序。我将介绍三种方式,所有这些都是不同的环境(即,他们可以利用)。
方法1-在Rexx环境中运行程序.
这需要运行程序IRXJCL,并通过字段传递程序名称(即PDS的成员名称)(您也可以传递参数;通过解析ARG语句访问参数)。
IRXJCL需要(通常)3 DDNAMES --它们是SYSEXEC (程序所在的PDS )、SYSTSIN (这可以反映终端输入)和SYSTSPRTE 215>(这是发送终端输出的位置)。
下面是根据上面提供的信息工作的JCL:
//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数据调用的:-
//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命令。
//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程序。
发布于 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主管来说已经足够了。
发布于 2016-11-21 07:45:53
对MikeT的回答还有更多的评论.
假设您希望您的JCL是独立的:您希望在JCL中包含一个REXX exec作为流中的数据集,而不是引用存储在PDS成员中的REXX exec。
下面是“技巧”(对于IRXJCL;我还没有在其他程序中测试这个技巧):指定一个null (X'00')字节作为EXEC语句的EXEC属性的值。
若要指定空字节,请使用z/OS编辑器和HEX ON。
//REXX EXEC PGM=IRXJCL,PARM=' '
66DCEE44444CECC4DCD7CDEDCD6DCDD7707
1195770000057530774E997133B7194ED0D例如,如果输入以空格作为值的PARM=' ',则用0覆盖该空格的十六进制值的4。
下面是一个包含流内REXX exec的示例作业步骤,它处理同一作业中前一步的输出:
//* 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=* 备注:
DLM=$$使您可以使用REXX注释语法(/*),而无需过早结束流内数据集。&&CSV指由前一个作业步骤创建的CSV文件(未显示)我使用这种“流中的REXX”技术,主要是为临时执行人员将批处理程序的输出转换为我真正想要的。这种技术对于演示和快速跳过想法很有用;其他开发人员可以在SDSF输出中就地查看JCL中的REXX代码,对其进行调整,然后提交经过调整的版本。
https://stackoverflow.com/questions/38867243
复制相似问题