

AWS 大型机现代化服务（托管运行时环境体验）不再向新客户开放。有关类似于 AWS 大型机现代化服务（托管运行时环境体验）的功能，请浏览 AWS 大型机现代化服务（自我管理体验）。现有客户可以继续正常使用该服务。有关更多信息，请参阅[AWS 大型机现代化可用性变更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 命令实用程序
<a name="system-commands-utilities"></a>

本节与实用程序有关，其作用是处理使用控制卡提供的用户命令。

## IKJEFT1A/IKJEFT1B/KEQEFT01/IKJEFT01/DSNDBTCH
<a name="ikjeft1a-ikjeft1b-keqeft01-ikjeft01-dsndbtch"></a>

### IKJEFT1一个目的
<a name="ikjeft1a-purpose"></a>

IKJEFT1A 及其别名在批处理作业中执行 TSO（**T** ime **S** haring **O** 选项）命令，无需交互式 TSO 会话，桥接非交互式批处理和交互式 TSO 环境。

模仿传统的 IKJEFT1 A 行为，但存在特定于环境的差异：例如，在现代环境中，T DB2 ERM (inate) 命令会被忽略（记录为信息）。

**注意**  
此处未详细介绍命令语法- IKJEFT1 A 使用未更改的旧命令数据集。有关 TSO 命令的详细信息，请参阅旧版平台文档。

### IKJEFT1一个签名
<a name="ikjeft1a-signature"></a>

使用`SYSTSIN`数据集进行命令输入（通过 JCL `DD` 指令定义）。现代化版本使用相同的数据集，保持不变。仅在现代化的 Groovy 作业脚本中调用。

### IKJEFT1A 相关的配置参数
<a name="ikjeft1a-configuration"></a>

该实用程序的行为受以下配置参数的影响：
+ `systin.encoding`

有关配置此参数[可选 Web 应用程序的可用属性](ba-runtime-key-value.md#ba-runtime-key-value-web)的详细信息，请参阅。

### IKJEFT1A. Checks/Error 处理
<a name="ikjeft1a-error-handling"></a>

当 SYSTSIN 数据集中存在不支持的命令时，就会抛出 a `RuntimeException`。

### IKJEFT1A 示例用法
<a name="ikjeft1a-sample-usages"></a>

旧版 JCL 脚本（使用`SYSTSIN`数据集的内联内容，使用`DD *`指令）

```
//*********************************************************************         
//* READ THE TEMPORARY INPUT FILE                                     *         
//*********************************************************************         
// IF IDCM00032.RC = 1 THEN                                                    
//067FILEKEY  EXEC PGM=IKJEFT01,DYNAMNBR=20                                     
//SYSTSIN   DD *                                                                
 DSN SYSTEM(DB2P)                                                               
 RUN  PROGRAM(067-fileKey) PLAN(FILEKEYPLAN)    PARM('RT')                      
 END                                                                            
/*                                                                              
//TEMPVSAM  DD DSN=IDXVIDEO.TEMPVSAM,DISP=SHR                                   
//FKOUT     DD DSN=output(out067.txt),DISP=(NEW,CATLG)                          
// ENDIF                                                                        
//*********************************************************************
```

还有匹配的现代化脚本（在 groovy 中）—— `SYSTSIN` 数据集的内联内容由 “流” 表示 —

```
// STEP 067FILEKEY - PGM - IKJEFT01***********************************************
def step067FILEKEY(Object shell, Map params, Map programResults){
    shell.with {
        if (checkValidProgramResults(programResults)) {
            return execStep("067FILEKEY", "IKJEFT01", programResults, {
                mpr
                    .withFileConfigurations(new FileConfigurationUtils()
                        .withJobContext(jobContext)
                        .fileSystem("SYSTSIN")
                        .stream(
""" DSN SYSTEM(DB2P)                                                               
 RUN  PROGRAM(067-fileKey) PLAN(FILEKEYPLAN)    PARM('RT')                      
 END
""", getEncoding())
                        .build()
                        .bluesam("TEMPVSAM")
                        .dataset("IDXVIDEO.TEMPVSAM")
                        .disposition("SHR")
                        .build()
                        .fileSystem("FKOUT")
                        .path("output(out067.txt)")
                        .disposition("NEW")
                        .normalTermination("CATLG")
                        .build()
                        .getFileConfigurations())
                    .withParameters(params)
                    .runProgram("IKJEFT01")
                })
        }
    }
}
```

## QCMDEXC
<a name="qcmdexc"></a>

### QCMDEXC 目的
<a name="qcmdexc-purpose"></a>

该实用程序模拟 AS/400 系统实用程序 QCMDEXC 的行为，用于在运行时以动态方式运行系统命令。

功能：
+ 动态解析和执行命令。
+ 支持命名和位置参数格式。

### QCMDEXC 签名
<a name="qcmdexc-signature"></a>

接受 1-2 个参数：
+ 第一：包含要执行的命令的字母数字数据
+ 第二（可选）：从第一个参数读取的长度（以字节为单位）（默认为全长）

### QCMDEXC 处理 Checks/Error
<a name="qcmdexc-error-handling"></a>

对于以下情况，`RuntimeException`将抛出 a：
+ 当提供的参数数量不是一两个时；
+ 如果 commands 参数为空或者要运行的命令无法识别；
+ 如果命令由于任何原因运行失败；此外，程序的返回代码将设置为 1。

### QCMDEXC 示例用法
<a name="qcmdexc-sample-usages"></a>

以下是旧版 COBOL 程序的用法示例：数据项`CL-COMMANDX`在用作 QCMDEXC 程序调用的参数之前先装有命令：

```
       INITIALIZE CL-COMMANDX.                                      
                                                               
       STRING                                                       
           "CPYF FROMFILE(PLAYERS) TOFILE(" DELIMITED BY SIZE,            
           "NEWFILE"                      DELIMITED BY SIZE,        
           ") MBROPT(*REPLACE) FMTOPT(*NOCHK) CRTFILE(*YES)"        
                                          DELIMITED BY SIZE         
           INTO CL-COMMANDX                                         
       END-STRING.                                                  
                                                               
       CALL "QCMDEXC"                  USING CL-COMMANDX            
                                             CLENGTHX.
```

一旦现代化为 Java 代码，它就会变成：

```
    DataUtils.initialize(ctx.getClCommandx().getClCommandxReference());
    StringConcatenationBuilder.newInstance(ctx.getClCommandx().getClCommandxReference())
        .addDelimitedBySize("CPYF FROMFILE(PLAYERS) TOFILE(")
        .addDelimitedBySize("NEWFILE")
        .addDelimitedBySize(") MBROPT(*REPLACE) FMTOPT(*NOCHK) CRTFILE(*YES)")
        .end();
    ctrl.callSubProgram("QCMDEXC", CallBuilder.newInstance()
        .byReference(ctx.getClCommandx().getClCommandxReference())
        .byReference(ctx.getClengthx().getClengthxReference())
        .getArguments(), ctx);
```

请注意，旧版命令内容在现代化代码中 “按原样” 使用，未经任何修改。