Использование команды OGET из JCL

Я пытался запустить команду OGET из JCL. Обычно я использовал бы командную строку ishell с помощью ISPF;6, а затем запускал команду оттуда, однако эта работа настолько велика, что мне нужно автоматизировать задачу.

До сих пор я пытался использовать IKJEF01, IKJEFT01 и команду OSHELL, а также BPXBATCH для отправки команды, но ни один из них не работал.

Команда, которую я хочу использовать, следующая:

OGET '/CPU/TMP/filename.IND' 'library.INDEX.EHH' BINARY CONVERT(NO)

Моя попытка с IKJEFT01 и OSHELL:

//TMP1  EXEC  PGM=IKJEFT01,                                 
//            DYNAMNBR=200                                  
//SYSPROC  DD  DSN=SYS1.SBPXEXEC,DISP=SHR                   
//*                                                         
//SYSTSPRT DD  SYSOUT=*                                     
//SYSOUT   DD  SYSOUT=*                                     
//*                                                         
//SYSTSIN  DD  *                                            
OSHELL OGET '/CPU/TMP/filename.IND' 'library.INDEX.EHH' - 
             BINARY CONVERT(NO)                                        
//* 

Моя попытка использования BPXBATCH:

//SHELLCMD  EXEC PGM=BPXBATCH                                        
//STDERR     DD SYSOUT=*                                             
//STDOUT     DD SYSOUT=*                                             
//STDPARM    DD *                                                    
SH OGET '/CPU2/TMP/filename.IND' 'library.INDEX.EHH' BINARY CONVERT(NO)
/*                                                                   

Оба метода выдают одну и ту же ошибку:

FSUM1006 A shell was not specified. Processing continues using the default shell name.
FSUM7332 syntax error: got (, expecting Newline

Если я удаляю CONVERT(NO), вместо этого я получаю следующие ошибки:

FSUM1006 A shell was not specified. Processing continues using the default shell name.
OGET: FSUM7351 not found 

Кто-нибудь может помочь?


person sCuper    schedule 17.12.2019    source источник
comment
Согласно документации BPXBATCH, вы должны указать, собираетесь ли вы запускать оболочку или программу: BPXBATCH SH [pgmname] | PGM [имя_программы]   -  person NicC    schedule 17.12.2019
comment
Это правда. Изначально он был там, но мне пришлось изменить часть своего кода, прежде чем я мог опубликовать здесь, поэтому он был удален в процессе. Добавив его обратно в мой вопрос (он все время был в моем коде, поэтому исходная проблема преобладает).   -  person sCuper    schedule 17.12.2019


Ответы (3)


Я не нашел способа решить свою первоначальную проблему, но написал REXX-скрипт, который выполнил эту работу:

/* REXX demo */                                
ADDRESS TSO                                                  
"OGET '/CPU2/tmp/filename.ind'    'library.INDEX.EHH' BINARY
 CONVERT(NO)"   

Это было вызвано из моего CNTL со следующим кодом:

//STEPREXX EXEC PGM=IKJEFT01,PARM='REXX-name'
//SYSEXEC   DD DSN=PDS,DISP=SHR      
//SYSTSPRT  DD  SYSOUT=*                           
//SYSTSIN   DD  DUMMY                              
person sCuper    schedule 17.12.2019

У меня была аналогичная задача в прошлом, и я получил следующее решение:

//COPYSTEP EXEC PGM=IKJEFT01
//         SET SRC='/CPU2/tmp/filename.ind'
//         SET Q=''''
//IN       DD PATH=&Q.&SRC.&Q,PATHOPTS=(ORDONLY)
//OUT      DD DSN=LIBRARY.INDEX.EHH,DISP=(,CATLG),
//          SPACE=(TRK,(10,10),RLSE),RECFM=FB,LRECL=4000,BLKSIZE=0
//SYSTSPRT DD SYSOUT=*                                          
//SYSTSIN  DD *                                                  
 OCOPY INDD(IN) OUTDD(OUT) BINARY CONVERT(NO) PATHOPTS(USE)
/*

Другой вариант заключался в том, чтобы создать сценарий оболочки в USS и выполнить его из JCL.

//SHRUN  EXEC PGM=BPXBATCH,PARM='SH'                    
//STDIN     DD  PATH='/path/to/script/script.name',
//          PATHOPTS=(OCREAT,ORDONLY),                  
//          PATHMODE=(SIRWXU,SIROTH),                   
//          PATHDISP=(KEEP,KEEP)                        
//STDOUT  DD SYSOUT=*                                   
//STDERR  DD SYSOUT=*                                   
//STDENV  DD *

сам скрипт очень простой

cp -W "seqparms='RECFM=FB,LRECL=4000'" /CPU2/tmp/filename.ind "//'LIBRARY.INDEX.EHH'" 
person VadimKo    schedule 18.12.2019
comment
Благодарю вас! Похоже, это отлично сработает! Я не так много знаю о сценариях оболочки, знаете ли вы о хорошем веб-сайте, который хорошо это объясняет? Немного погуглил, пока искал решение этой проблемы, но большая часть того, что я нашел, просто говорила об этом, не документируя, как это написать. - person sCuper; 18.12.2019

OGET — это команда TSO, доступ к которой осуществляется напрямую через IKJEFT01. Нет необходимости вызывать OSHELL или BPXBATCH (кстати... OSHELL — это просто REXX, который вызывает BPXBATCH).

Просто используйте OGET напрямую (без команды OSHELL) в исходном JCL, и он будет работать:

//TMP1  EXEC  PGM=IKJEFT01,                                 
//            DYNAMNBR=200                                  
//SYSPROC  DD  DSN=SYS1.SBPXEXEC,DISP=SHR                                                                          
//SYSTSPRT DD  SYSOUT=*                                     
//SYSOUT   DD  SYSOUT=*                                                                                            
//SYSTSIN  DD  *                                            
OGET '/CPU/TMP/filename.IND' 'library.INDEX.EHH' - 
             BINARY CONVERT(NO)                                        
//* 
person Rich Jackson    schedule 18.12.2019
comment
Я также пробовал это, но это не сработало, как ожидалось. - person sCuper; 06.01.2020
comment
Любопытно, что не работает... Вы получаете сообщение об ошибке? Он должен работать как есть, без необходимости использования других команд или сценариев. - person Rich Jackson; 07.01.2020