运行 前一个 JCL 步骤未找到文件时的步骤
Run step when previous JCL step did not find file
在下面的 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命令来测试您的目录是否存在。
//EXIST001 EXEC PGM=BPXBATCH,PARM='SH test -e /u/woodsmn/jjk'
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
您可能需要更奇特一点,并使用 STDPARM DD 传递“set -o errexit”以使 return 代码完全按照您的意愿工作。
有两件事要改变:
首先,运行 IKJEFT1B
而不是 IKJEFT01
,因为前者将在 SYSTSIN
中的命令以非零 return 结束时结束代码,并且 return 代码将成为步骤 return 代码。
其次,在 OCOPY
之前使用 ALLOC
命令分配 z/OS UNIX 文件。 ALLOC
如果无法分配文件(无论出于何种原因),将 return 设置为 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
步骤中的 return 代码。 (顺便说一句,您不需要 NETVIEW
步骤,而是直接从 COPYHFS
步骤测试 return 代码。)
IKJEFT1B
,以及IKJEFT01
,第三种变体IKJEFT1A
在附录A中有描述。执行终端监控程序在手册中 z/OS TSO/E 自定义 .
在下面的 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命令来测试您的目录是否存在。
//EXIST001 EXEC PGM=BPXBATCH,PARM='SH test -e /u/woodsmn/jjk'
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
您可能需要更奇特一点,并使用 STDPARM DD 传递“set -o errexit”以使 return 代码完全按照您的意愿工作。
有两件事要改变:
首先,运行 IKJEFT1B
而不是 IKJEFT01
,因为前者将在 SYSTSIN
中的命令以非零 return 结束时结束代码,并且 return 代码将成为步骤 return 代码。
其次,在 OCOPY
之前使用 ALLOC
命令分配 z/OS UNIX 文件。 ALLOC
如果无法分配文件(无论出于何种原因),将 return 设置为 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
步骤中的 return 代码。 (顺便说一句,您不需要 NETVIEW
步骤,而是直接从 COPYHFS
步骤测试 return 代码。)
IKJEFT1B
,以及IKJEFT01
,第三种变体IKJEFT1A
在附录A中有描述。执行终端监控程序在手册中 z/OS TSO/E 自定义 .