上一个 JCL 步骤未找到文件时运行步骤

问题描述

在以下 JCL 中,HFS 路径 /u/woodsmn/jjk 不存在。它会引发 JCL 错误并且不会运行 copYHFS 步骤,也不会运行任何其他步骤。我希望它检测丢失的文件,并运行 FAILIND 步骤。

我怀疑 MVS 会引发 JCL 错误并完全忽略可能适用的任何 COND 条件。我希望它提出一些失败步骤条件代码并以这种方式行事。

当 PATH 不存在时,如何重写它以执行步骤?

//WOODSMN1 JOB (1111),MSGLEVEL=(1,1),CLASS=A,MSGCLASS=H,//  USER=WOODSMN,REGION=1M                                     
//copYHFS EXEC pgm=IKJEFT01                                    
//INHFS  DD PATH='/u/woodsmn/jjk',//          PATHOPTS=(ORDONLY),RECFM=VB,LRECL=255,BLKSIZE=32760
//OUTMVS DD DSN=WOODSMN.TESTDS1,//          disP=(NEW,CATLG,DELETE),//          SPACE=(TRK,(1,1)),//          DCB=(LRECL=80,RECFM=FB,BLKSIZE=8080)               
//SYSTSPRT DD SYSOUT=*                                         
//SYSTSIN  DD *                                                
OcopY INDD(INHFS) OUTDD(OUTMVS) CONVERT(NO)                    
/*                                                             
//*                                                            
//NETVIEW EXEC pgm=IEFBR14,COND=(0,EQ,copYHFS)                 
//*                                                            
//SUCCIND EXEC pgm=IEBGENER,REGION=1M,NETVIEW)  
//SYSPRINT DD SYSOUT=*                                     
//SYSUT1 DD *                                              
Attempt to put file succeeded                              
/*                                                         
//SYSUT2 DD PATHOPTS=(ORDWR,OTrunc,OCREAT),PATHMODE=SIRWXU,//  PATHdisP=(KEEP,//  PATH='/u/woodsmn/TESTDS.SUCCESS'                       
//SYSIN DD DUMMY                                           
//*                                                        
//FAILIND EXEC pgm=IEBGENER,GT,NETVIEW)  
//SYSPRINT DD SYSOUT=*                                     
//SYSUT1 DD *                                              
Attempt to put file Failed                                 
/*                                                         
//SYSUT2 DD PATHOPTS=(ORDWR,//  PATH='/u/woodsmn/TESTDS.FAIL'                          
//SYSIN DD DUMMY                                           
//

解决方法

使用 BPXBATCH 执行 shell 命令来测试您的目录是否存在。

//EXIST001 EXEC PGM=BPXBATCH,PARM='SH test -e /u/woodsmn/jjk'
//STDOUT   DD  SYSOUT=*
//STDERR   DD  SYSOUT=*

您可能需要变得更加奇特,并使用 STDPARM DD 传递 `set -o errexit' 以使返回代码完全按照您的意愿工作。

,

有两点需要改变:

首先,运行IKJEFT1B而不是IKJEFT01,因为当SYSTSIN中的命令以非零返回码结束时,前者将结束,并且该返回码将成为步骤返回代码。

其次,在 ALLOC 之前使用 OCOPY 命令分配 z/OS UNIX 文件。如果 ALLOC 无法分配文件(无论出于何种原因),它将返回 RC=12。

因此,您的第一步应如下所示:

//COPYHFS  EXEC PGM=IKJEFT1B                                    
//OUTMVS   DD DSN=WOODSMN.TESTDS1,//            DISP=(NEW,CATLG,DELETE),//            SPACE=(TRK,(1,1)),//            DCB=(LRECL=80,RECFM=FB,BLKSIZE=8080)               
//SYSTSPRT DD SYSOUT=*                                         
//SYSTSIN  DD *                                                
  ALLOC F(INHFS) PATH('/u/woodsmn/jjk') -                               
        PATHOPTS(ORDONLY) RECFM(V B) LRECL(255) BLKSIZE(32760)

  OCOPY INDD(INHFS) OUTDD(OUTMVS) CONVERT(NO)                    
/*                                            

然后您可以照常测试 COPYHFS 步骤的返回码。 (顺便说一句,您不需要那个 NETVIEW 步骤,而是直接测试 COPYHFS 步骤的返回码。)

IKJEFT1BIKJEFT01 和第三种变体IKJEFT1A附录 A. 执行终端监控程序中在手册中进行了描述z/OS TSO/E 定制