求助:用REXX/ISPF宏为PDS中JCL成员添加/*XEQ卡
批量给JCL添加/*XEQ卡的REXX实现方案
一、REXX遍历PDS成员的核心代码实现
以下是基于ISPF服务的REXX脚本,可遍历指定PDS的所有成员,自动在作业卡下方插入/*XEQ卡:
/* REXX */ ARG pdsname "("membermask")" IF pdsname = "" THEN DO SAY "请输入目标JCL库名,格式:'USER.PROD.JCL'(*)" EXIT 8 END /* 初始化ISPF环境 */ ADDRESS ISPEXEC "CONTROL ERRORS RETURN" /* 打开目标PDS库 */ "LMOPEN DATAID(DID) DATASET('"pdsname"') OPTION(INPUT OUTPUT)" IF RC <> 0 THEN DO SAY "打开库'"pdsname"'失败,RC="RC EXIT RC END /* 循环读取库内成员列表 */ DO WHILE RC = 0 "LMMLIST DATAID("DID") OPTION(LIST) MEMBER(MEM) STATS(STATS)" IF RC = 0 THEN CALL PROCESS_MEMBER pdsname, MEM END /* 关闭PDS库 */ "LMCLOSE DATAID("DID")" EXIT 0 /* 单个JCL成员处理子过程 */ PROCESS_MEMBER: PARSE ARG dsn, mem "LMOPEN DATAID(MID) DATASET('"dsn"("mem")') OPTION(INPUT OUTPUT)" IF RC <> 0 THEN DO SAY "打开成员'"dsn"("mem")"'失败,RC="RC RETURN END /* 读取JCL内容到数组 */ "LMREAD DATAID("MID") STEM(JCL.)" IF RC = 0 THEN DO /* 跳过已存在/*XEQ卡的成员 */ has_xeq = 0 DO i = 1 TO JCL.0 IF SUBSTR(JCL.i,1,5) = "/*XEQ" THEN DO has_xeq = 1 LEAVE END END IF has_xeq = 1 THEN DO SAY "成员"mem"已包含/*XEQ卡,跳过" "LMCLOSE DATAID("MID")" RETURN END /* 定位作业卡(匹配//开头且包含JOB关键字的行) */ jobcard_pos = 0 DO i = 1 TO JCL.0 IF SUBSTR(JCL.i,1,2) = "//" & POS("JOB", JCL.i) > 0 THEN DO jobcard_pos = i LEAVE END END /* 插入/*XEQ卡到作业卡下一行 */ IF jobcard_pos > 0 THEN DO DO j = JCL.0 DOWNTO jobcard_pos + 1 JCL.j = JCL.j - 1 END JCL.jobcard_pos + 1 = "/*XEQ LPAR(MAINLPAR)" /* 替换为你的主LPAR名称 */ JCL.0 = JCL.0 + 1 /* 将修改后的内容写回成员 */ "LMREPL DATAID("MID") STEM(JCL.)" IF RC = 0 THEN SAY "成功修改成员:"mem ELSE SAY "修改成员"mem"失败,RC="RC END END "LMCLOSE DATAID("MID")" RETURN
二、宏的配置与运行步骤
- 保存脚本:把上述代码保存到你的REXX数据集,比如
USER.REXX.LIB(ADDXEQ) - 创建ISPF宏:
- 进入ISPF主菜单,选择3.7(数据集列表),定位到你的REXX库
- 选中成员
ADDXEQ,输入EDIT进入编辑界面,执行CREATE MACRO命令完成宏定义 - 或直接在ISPF命令行执行:
ISPEXEC CREATE MACRO(ADDXEQ) DSN('USER.REXX.LIB')
- 运行宏:
- 全量修改:在ISPF命令行输入
ADDXEQ 'USER.PROD.JCL'(*),其中USER.PROD.JCL是目标JCL库 - 增量修改:指定成员掩码,比如修改所有PROD开头的成员:
ADDXEQ 'USER.PROD.JCL'(PROD*)
- 全量修改:在ISPF命令行输入
- 前置注意事项:
- 务必先备份目标JCL库:执行TSO命令
COPYDSN 'USER.PROD.JCL' TO('USER.PROD.JCL.BAK') - 先测试单个成员验证逻辑:
ADDXEQ 'USER.PROD.JCL'(TESTJOB01)
- 务必先备份目标JCL库:执行TSO命令
三、针对Endevor输出JCL的优化点
如果Endevor生成的JCL有特殊格式,可调整作业卡判断逻辑,比如匹配更严格的作业卡格式:
/* 仅匹配//作业名 JOB 开头的行 */ IF SUBSTR(JCL.i,1,2) = "//" & SUBSTR(JCL.i,3,1) <> "*" & POS(" JOB ", JCL.i) > 0 THEN DO jobcard_pos = i LEAVE END
内容的提问来源于stack exchange,提问作者Monica Collins
相关产品推荐
相关产品推荐

