当需要从 z/OS 中下载一个 PS 文件,或者下载一个 Member 时,我们可以简单地使用 FTP 或者 IND$FILE 将文件下载回来,但是如果想要下载一整个 PDS 呢?总不能一个个地去下载吧,此时,XMIT 命令就派上用场了。


TRANSMIT 命令

TRANSMIT 命令用于将指定文件打包成 XMIT 档案以方便传输。

语法

使用一条命令前,必须要知道这条命令的语法。那么 XMIT 命令的语法如下:
注:TRANSMIT 命令可以简写为 XMIT

1
XMIT (nodeid.username) DSNAME('input.dataset.name') [MEMBERS(member1, member2, ...)] OUTDSN('output.dataset.name')

其中:

  • (nodeid.username) 为目标机器的 JES2 Node 名,以及接收用户的 TSOID,不过亲测在这里写自己的 Node 名和 TSOID 也能正常使用。通常来说,本机的 Node name 为 N1
  • DSNAME 为要打包的数据集名字
  • 如果只打包这个 PDS 中的一部分 member,则可以在 MEMBERS 参数中指定。因为目前还没有用过,所以不知道可不可以指定通配符
  • OUTDSN 为打包之后输出文件的数据集名字

TRANSMIT 命令的官方手册在 这里 ,完整的 TRANSMIT 命令的语法在 这里 ,参数的详细说明在 这里

另外,根据 IBM 员工 Isabel Arnold 的建议,在打包之前最好先创建一个 DSORG=FB,LRECL=80,BLKSIZE=3120 的文件供 TRANSMIT 用作输出文件。

示例

如果我想要打包 IBMUSER.COBOL.SRC 这个 PDS 中的所有 member,打包输出文件名为 IBMUSER.COBOL.SRC.XMIT 那么命令可以这样写:

1
XMIT (N1.IBMUSER) DSN('IBMUSER.COBOL.SRC') OUTDSN('IBMUSER.COBOL.SRC.XMIT')

RECEIVE 命令

RECEIVE 命令用于解包 XMIT 档案。

语法

同样,这里先展示 RECEIVE 命令的语法:

1
RECEIVE INDSN('xmit.dataset.name')

其中 INDSN 为 XMIT 档案的文件名。

示例

如果现在我在另一台主机上接收到了这个 XMIT 档案,那么我可以使用如下命令解包这个文件:

1
RECEIVE INDSN('IBMUSER.COBOL.SRC.XMIT')

在 RECEIVE 命令成功识别指定的 XMIT 档案之后,会输出如下信息:

1
2
INMR901I Dataset IBMUSER.COBOL.SRC from IBMUSER on NODENAME
INMR906A Enter restore parameters or 'DELETE' or 'END' +

此时 RECEIVE 命令等待用户输入解包信息,我们可以回复如下命令:

1
DA('IBMUSER.COBOL.SRC')

来将内容解包至 IBMUSER.COBOL.SRC 中。

此处需要注意的是,如果目标数据集不存在,则 RECEIVE 会自动创建一个同名数据集,但接下来的解包过程可能会因这个数据集的空间不够用于存放解包出来的文件而报出 ABEND B37 。为避免这种情况发生,建议在 RECEIVE 前预先创建好需要的数据集,并保证数据集的空间足够。

在输入 DA 命令后,RECEIVE 将会试图向指定位置解包,并且会将结果输出至终端。

对 INMR906A 消息的回复

INMR906A 的消息,有如下三种回复:

  • DATASET (‘output.dataset.name’) - 将 XMIT 档案解包至指定位置,可简写为 DA ()
  • DELETE - 删除该 XMIT 档案
  • END - 退出,不执行任何操作

参考文档

  • TRANSMIT command
  • TRANSMIT command syntax
  • TRANSMIT command operands
  • RECEIVE command
  • Receiving Data Sets with the RECEIVE Command
  • Transfering Load Modules between Mainframes using XMIT and ftp