我如何 运行 我的 Rexx 程序作为批处理作业?
How can I run my Rexx program as a batch job?
我有一个 Rexx 程序,我想 运行 作为批处理作业。我该怎么做?
这是我的程序:-
/* Rexx – HELLO – Write Hello World */
Say "hello World"
该程序在 PDS ME.USER.EXEC
.
中作为成员 HELLO
定位
我安装的有效 JOB CARD 是(我们的环境包括 ISPF/PDF 而不是 ROSCOE):-
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
注意!这已写成教程
您可以通过多种方式 运行 通过批处理程序。我将介绍 3 种方法,所有这些方法都因环境而异(即它们可以利用什么。)
方法 1 - 运行 Rexx 环境中的程序。
这需要运行安装程序 IRXJCL 并通过 PARM[= 传递程序的名称(即 PDS 的成员名称) 92=] 字段(您还可以传递参数;通过 PARSE ARG 语句访问它们)。
IRXJCL 需要(通常)3 DDNAMES 它们是 SYSEXEC(PDS 所在的程序位于),SYSTSIN(这可以反映终端输入)和SYSTSPRT(这是发送终端输出的地方)。
这里是 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=*
//*-------------------------------------------------------------------
This method, although the simplest (by just a few lines of JCL), is the most restrictive in that it does not allow the use of
TSO/E services, such as TSO/E commands and most of the TSO/E external
functions.
However, as IRXJCL is a Rexx processor, there is no requirement to let
TSO/E know that it is a Rexx program (the first line must include
REXX).
方法 2 - 运行 来自 TSO/E 环境的程序
这需要 运行宁其中一个 TSO/E 批处理程序 IKJEFT01 在此示例中使用。备选方案是 IKJEFT1A 和 IKJEFT1B。 TSO/E 可以通过此方法使用服务和命令(例如,在使用 TIME 命令 的此方法末尾注明)
Comprehensive information about the differences between the programs
can be found at Writing JCL for command
execution
IKJEFT01 的 JCL 与方法 1 中使用的 JCL 相似。额外的 DDNAME SYSPROC 可以编码。 SYSPROC 是 DDNAME,其中 CLISTS 所在;除了 SYSEXEC 之外,您还可以在此处找到 Rexx 程序(这不是必需的,建议是对两者进行编码,并且 SYSEXEC 用于 Rexx 程序,SYSPROC 用于 CLISTS)。
It's the requirement that Rexx is on the first line that
differentiates a Rexx program from a CLIST (by the TSO/E processor). Thus, if the Rexx program is found/located via SYSEXEC, if I recall correctly, this negates the requirement).
Another suggestion is to always include REXX in the first line of a Rexx program>
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=*
//*-------------------------------------------------------------------
If, for example, the following were used (i.e. added TIME as another
line to SYSTSIN) then the TSO/E TIME command would be run (which would
cause the time to be displayed to SYSTSPRT).
//SYSTSIN DD *
HELLO
TIME
方法三-运行ISPF环境下的程序
此方法使用 IKJEFT01 程序(请参阅方法 2 了解 IKJEFT1A/B 替代方案)。但是,它随后使用 ISPSTART 命令在 ISPF 环境中 运行 程序;启用 ISPF 服务(例如文件裁剪(骨架)ISPF 表等)。
ISPF 环境有额外的要求,因为需要分配 ISPF 库才能启动 ISPF 环境。至少将提供的 ISPF 库分配给 ddnames ISPPLIB(ISPF 面板),ISPMLIB(ISPF消息)和 ISPTLIB(ISPF 表)。 ISPPROF 是 ISPF 为会话保存一些配置文件数据的地方,因此临时存储就足够了(UNIT=SYSDA 通常可用,但并非总是可用)。
Note you would likely allocate, at a minimum, the installations system
libraries (the TSO/E command LISTA can likely be used to determine
these from a foreground session). Alternately, ask you local friendly system programmers. In the following they are SYS1.ISPPLIB, SYS1.ISPMLIB and 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=*
//*-------------------------------------------------------------------
Note this is not a fully comprehensive, it is an overview that should
suffice for getting started with running Rexx programs in batch.
对上述答案的补充说明。如果您希望 运行 使用 ISPF 服务的 REXX exec,以下技术说明可能会有所帮助...
http://www.ibm.com/support/docview.wss?uid=swg21023990
确保将 ISPPROF 文件连接为 ISPTLIB 中的第一个文件。该示例使用一个对作业唯一的临时文件。如果 REXX exec 提供 table 服务,您可能需要 ISPTABL DD。我建议对 ISPPROF 和 ISPTABL 使用相同的文件,并首先在 ISPTLIB 中将其连接起来。如果 table 需要保存,这可以是一个永久文件,但是它不应该被其他作业或 TSO 用户使用,以避免排队错误。
正如之前的更新所述,他的答案足以满足简单的 REXX 执行程序。
对 MikeT 的回答还有更多评论...
假设您希望 JCL 是独立的:您希望将 REXX exec 作为流内数据集包含在 JCL 中,而不是引用存储在 PDS 成员中的 REXX exec。
这里是 "trick"(对于 IRXJCL;我还没有用其他程序测试过这个技巧):指定单个空 (X'00') 字节作为 PARM
属性的值EXEC
声明。
要指定空字节,请使用 z/OS ISPF 编辑器和 HEX ON
:
//REXX EXEC PGM=IRXJCL,PARM=' '
66DCEE44444CECC4DCD7CDEDCD6DCDD7707
1195770000057530774E997133B7194ED0D
例如,如果您输入 PARM=' '
并使用 space 作为值,请将 space 的十六进制值的 4
改写为 0
.
这是一个示例作业步骤,其中包含一个流内 REXX 执行程序,该执行程序处理同一作业中上一个步骤的输出:
//* 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 文件
我使用这种 "in-stream REXX" 技术主要是为了临时执行人员将批处理程序的输出转换为我 真正 想要的。这种技术对于演示和快速跳出想法很有用;其他开发人员可以在 SDSF 输出的 JCL 中原位查看 REXX 代码,对其进行调整,然后提交调整后的版本。
我有一个 Rexx 程序,我想 运行 作为批处理作业。我该怎么做?
这是我的程序:-
/* Rexx – HELLO – Write Hello World */
Say "hello World"
该程序在 PDS ME.USER.EXEC
.
HELLO
定位
我安装的有效 JOB CARD 是(我们的环境包括 ISPF/PDF 而不是 ROSCOE):-
//MYJOB JOB ,,CLASS=1,MSGCLASS=H,NOTIFY=&SYSUID
注意!这已写成教程
您可以通过多种方式 运行 通过批处理程序。我将介绍 3 种方法,所有这些方法都因环境而异(即它们可以利用什么。)
方法 1 - 运行 Rexx 环境中的程序。
这需要运行安装程序 IRXJCL 并通过 PARM[= 传递程序的名称(即 PDS 的成员名称) 92=] 字段(您还可以传递参数;通过 PARSE ARG 语句访问它们)。
IRXJCL 需要(通常)3 DDNAMES 它们是 SYSEXEC(PDS 所在的程序位于),SYSTSIN(这可以反映终端输入)和SYSTSPRT(这是发送终端输出的地方)。
这里是 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=*
//*-------------------------------------------------------------------
This method, although the simplest (by just a few lines of JCL), is the most restrictive in that it does not allow the use of TSO/E services, such as TSO/E commands and most of the TSO/E external functions.
However, as IRXJCL is a Rexx processor, there is no requirement to let TSO/E know that it is a Rexx program (the first line must include REXX).
方法 2 - 运行 来自 TSO/E 环境的程序
这需要 运行宁其中一个 TSO/E 批处理程序 IKJEFT01 在此示例中使用。备选方案是 IKJEFT1A 和 IKJEFT1B。 TSO/E 可以通过此方法使用服务和命令(例如,在使用 TIME 命令 的此方法末尾注明)
Comprehensive information about the differences between the programs can be found at Writing JCL for command execution
IKJEFT01 的 JCL 与方法 1 中使用的 JCL 相似。额外的 DDNAME SYSPROC 可以编码。 SYSPROC 是 DDNAME,其中 CLISTS 所在;除了 SYSEXEC 之外,您还可以在此处找到 Rexx 程序(这不是必需的,建议是对两者进行编码,并且 SYSEXEC 用于 Rexx 程序,SYSPROC 用于 CLISTS)。
It's the requirement that Rexx is on the first line that differentiates a Rexx program from a CLIST (by the TSO/E processor). Thus, if the Rexx program is found/located via SYSEXEC, if I recall correctly, this negates the requirement).
Another suggestion is to always include REXX in the first line of a Rexx program>
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=*
//*-------------------------------------------------------------------
If, for example, the following were used (i.e. added TIME as another line to SYSTSIN) then the TSO/E TIME command would be run (which would cause the time to be displayed to SYSTSPRT).
//SYSTSIN DD * HELLO TIME
方法三-运行ISPF环境下的程序
此方法使用 IKJEFT01 程序(请参阅方法 2 了解 IKJEFT1A/B 替代方案)。但是,它随后使用 ISPSTART 命令在 ISPF 环境中 运行 程序;启用 ISPF 服务(例如文件裁剪(骨架)ISPF 表等)。
ISPF 环境有额外的要求,因为需要分配 ISPF 库才能启动 ISPF 环境。至少将提供的 ISPF 库分配给 ddnames ISPPLIB(ISPF 面板),ISPMLIB(ISPF消息)和 ISPTLIB(ISPF 表)。 ISPPROF 是 ISPF 为会话保存一些配置文件数据的地方,因此临时存储就足够了(UNIT=SYSDA 通常可用,但并非总是可用)。
Note you would likely allocate, at a minimum, the installations system libraries (the TSO/E command LISTA can likely be used to determine these from a foreground session). Alternately, ask you local friendly system programmers. In the following they are SYS1.ISPPLIB, SYS1.ISPMLIB and 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=*
//*-------------------------------------------------------------------
Note this is not a fully comprehensive, it is an overview that should suffice for getting started with running Rexx programs in batch.
对上述答案的补充说明。如果您希望 运行 使用 ISPF 服务的 REXX exec,以下技术说明可能会有所帮助...
http://www.ibm.com/support/docview.wss?uid=swg21023990
确保将 ISPPROF 文件连接为 ISPTLIB 中的第一个文件。该示例使用一个对作业唯一的临时文件。如果 REXX exec 提供 table 服务,您可能需要 ISPTABL DD。我建议对 ISPPROF 和 ISPTABL 使用相同的文件,并首先在 ISPTLIB 中将其连接起来。如果 table 需要保存,这可以是一个永久文件,但是它不应该被其他作业或 TSO 用户使用,以避免排队错误。
正如之前的更新所述,他的答案足以满足简单的 REXX 执行程序。
对 MikeT 的回答还有更多评论...
假设您希望 JCL 是独立的:您希望将 REXX exec 作为流内数据集包含在 JCL 中,而不是引用存储在 PDS 成员中的 REXX exec。
这里是 "trick"(对于 IRXJCL;我还没有用其他程序测试过这个技巧):指定单个空 (X'00') 字节作为 PARM
属性的值EXEC
声明。
要指定空字节,请使用 z/OS ISPF 编辑器和 HEX ON
:
//REXX EXEC PGM=IRXJCL,PARM=' '
66DCEE44444CECC4DCD7CDEDCD6DCDD7707
1195770000057530774E997133B7194ED0D
例如,如果您输入 PARM=' '
并使用 space 作为值,请将 space 的十六进制值的 4
改写为 0
.
这是一个示例作业步骤,其中包含一个流内 REXX 执行程序,该执行程序处理同一作业中上一个步骤的输出:
//* 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 文件
我使用这种 "in-stream REXX" 技术主要是为了临时执行人员将批处理程序的输出转换为我 真正 想要的。这种技术对于演示和快速跳出想法很有用;其他开发人员可以在 SDSF 输出的 JCL 中原位查看 REXX 代码,对其进行调整,然后提交调整后的版本。