在下面的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,COND=(0,EQ,NETVIEW)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD *
Attempt to put file succeeded
/*
//SYSUT2 DD PATHOPTS=(ORDWR,OTRUNC,OCREAT),PATHMODE=SIRWXU,
// PATHDISP=(KEEP,DELETE),
// PATH='/u/woodsmn/TESTDS.SUCCESS'
//SYSIN DD DUMMY
//*
//FAILIND EXEC PGM=IEBGENER,REGION=1M,COND=(0,GT,NETVIEW)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD *
Attempt to put file failed
/*
//SYSUT2 DD PATHOPTS=(ORDWR,OTRUNC,OCREAT),PATHMODE=SIRWXU,
// PATHDISP=(KEEP,DELETE),
// PATH='/u/woodsmn/TESTDS.FAIL'
//SYSIN DD DUMMY
//
使用BPXBATCH执行shell命令来测试目录的存在。
//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)
/*
您可能需要更具异国情调,并使用STDPARMDD传递"set-o errexit"以使返回代码完全按照您的意愿工作。
需要更改的两件事:
首先,运行IKJEFT01
而不是SYSTSIN
,因为当ALLOC
中的命令以非零返回代码结束时,前者将结束,并且该返回代码将成为步骤返回代码。
其次,在ALLOC
之前使用OCOPY
命令分配z/OS UNIX文件。如果COPYHFS
无法分配文件(无论出于何种原因(,它将返回RC=12。
所以,你的第一步应该是这样的:
PD_4然后,您可以像往常一样测试NETVIEW
步骤的返回代码。(顺便说一句,您不需要COPYHFS
步骤,而是直接测试IKJEFT1B
0步骤的返回代码。(
IKJEFT01
、IKJEFT1A
和第三变体CCD_13在附录A中进行了描述。执行z/OS TSO/E定制手册中的终端监视器程序。