简体   繁体   English

Windows-如何在批处理文件中逐字回显行?

[英]Windows - how to echo a line verbatim in a batch file?

I'm looking to generate a dynamic SAS file from a bat file so I can pass in some variables from the commandline. 我正在寻找从bat文件生成动态SAS文件的方法,以便可以从命令行传递一些变量。 I'm hoping to do this, 我希望做到这一点,

echo //**$1** JOB 99999,'IMS-MXG',CLASS=3,REGION=100M,                       00010026 > DETAIL_EXAMPLE
echo //             MSGCLASS=Z,MSGLEVEL=(1,1),NOTIFY=&SYSUID                 00020036 >> DETAIL_EXAMPLE
echo //JCLLIB JCLLIB ORDER=(SCBP.MXG.JCLLIB)                                 00030036 >> DETAIL_EXAMPLE
echo //MYSTEP EXEC MXGSAS,WORK='1500,500',                                   00040036 >> DETAIL_EXAMPLE
echo //       OPTIONS='PRINT=REPORT SYSPARM="SITE=CA,ZONE=PRIME"'            00050036 >> DETAIL_EXAMPLE
echo //DETAIL   DD DISP=SHR,DSN=**$2**                                       00060036 >> DETAIL_EXAMPLE
echo //REPORT   DD SYSOUT=*                                                  00070036 >> DETAIL_EXAMPLE
echo //SYSPRINT DD SYSOUT=*                                                  00080036 >> DETAIL_EXAMPLE
echo //SYSIN    DD *                                                         00090036 >> DETAIL_EXAMPLE
echo OPTIONS  LINESIZE=90 ERROR=1 PAGESIZE=32767 PAGENO=1 NUMBER NODATE      00100036 >> DETAIL_EXAMPLE
echo   SYMBOLGEN NOLABEL MISSING='' COMPRESS=YES                             00110036 >> DETAIL_EXAMPLE
echo   OBS=MAX REPLACE FORMDLIM='-' FORMCHAR='|-,???+????+=|-/\<>*';         00120036 >> DETAIL_EXAMPLE
echo                                                                         00130036 >> DETAIL_EXAMPLE
echo                                                                         00140036 >> DETAIL_EXAMPLE
echo DATA _NULL_;                                                            00150036 >> DETAIL_EXAMPLE

And get this, 得到这个

//**$1** JOB 99999,'IMS-MXG',CLASS=3,REGION=100M,                       00010026
//             MSGCLASS=Z,MSGLEVEL=(1,1),NOTIFY=&SYSUID                 00020036
//JCLLIB JCLLIB ORDER=(SCBP.MXG.JCLLIB)                                 00030036
//MYSTEP EXEC MXGSAS,WORK='1500,500',                                   00040036
//       OPTIONS='PRINT=REPORT SYSPARM="SITE=CA,ZONE=PRIME"'            00050036
//DETAIL   DD DISP=SHR,DSN=**$2**                                       00060036
//REPORT   DD SYSOUT=*                                                  00070036
//SYSPRINT DD SYSOUT=*                                                  00080036
//SYSIN    DD *                                                         00090036
OPTIONS  LINESIZE=90 ERROR=1 PAGESIZE=32767 PAGENO=1 NUMBER NODATE      00100036
  SYMBOLGEN NOLABEL MISSING='' COMPRESS=YES                             00110036
  OBS=MAX REPLACE FORMDLIM='-' FORMCHAR='|-,???+????+=|-/\<>*';         00120036
                                                                        00130036
                                                                        00140036
DATA _NULL_;                                                            00150036

But, this is what I'm getting, 但是,这就是我得到的,

  //**$1** JOB 99999,'IMS-MXG',CLASS=3,REGION=100M,                       00010026 
  //JCLLIB JCLLIB ORDER=(SCBP.MXG.JCLLIB)                                 00030036 
  //MYSTEP EXEC MXGSAS,WORK='1500,500',                                   00040036 
  //       OPTIONS='PRINT=REPORT SYSPARM="SITE=XX,ZONE=PRIME"'            00050036 
  //DETAIL   DD DISP=SHR,DSN=**$2**                                       00060036 
  //REPORT   DD SYSOUT=*                                                  00070036 
  //SYSPRINT DD SYSOUT=*                                                  00080036 
  //SYSIN    DD *                                                         00090036
  OPTIONS  LINESIZE=90 ERROR=1 PAGESIZE=32767 PAGENO=1 NUMBER NODATE      00100036 
    SYMBOLGEN NOLABEL MISSING='' COMPRESS=YES                             00110036

Notice how line 2, 12, 13, and 14 are missing. 请注意第2、12、13和14行是如何丢失的。 I'll probably need to look into escaping some of those characters on line 12, but the other lines are leaving me clueless on why they aren't appearing. 我可能需要研究在第12行中转义其中的某些字符,但其他几行让我不知道为什么它们不出现。

Is there a way to echo these lines verbatim? 有没有一种方法可以逐字回显这些行?

Thanks very much in advance. 首先十分感谢。

Use echo. 使用echo. instead of echo 而不是echo
That will preserve your leading whitespace and will also protect you against situations where you meant to echo an '@' sign ( echo@ ... has special interpretation, but echo. will not prepend a '.' and is safe) 这样可以保留您的前导空格,也可以保护您免受要回显'@'符号的情况的影响( echo@ ...具有特殊的解释,但echo。不会以'.'开头并且是安全的)

C:\Users\username>echo.//    Some setting                    00123567>some_file

C:\Users\username>echo.//   Some other stuff                 00123568>>some_file

C:\Users\username>echo.                                      00123569>>some_file

C:\Users\username>echo.                                      00123570>>some_file

C:\Users\username>more some_file
//    Some setting                    00123567
//   Some other stuff                 00123568
                                      00123569
                                      00123570

C:\Users\username>
@ECHO OFF
SETLOCAL
echo(//**$1** JOB 99999,'IMS-MXG',CLASS=3,REGION=100M,                       00010026 > q36271044.txt
echo(//             MSGCLASS=Z,MSGLEVEL=(1,1),NOTIFY=^&SYSUID                 00020036 >> q36271044.txt
echo(//JCLLIB JCLLIB ORDER=(SCBP.MXG.JCLLIB)                                 00030036 >> q36271044.txt
echo(//MYSTEP EXEC MXGSAS,WORK='1500,500',                                   00040036 >> q36271044.txt
echo(//       OPTIONS='PRINT=REPORT SYSPARM="SITE=CA,ZONE=PRIME"'            00050036 >> q36271044.txt
echo(//DETAIL   DD DISP=SHR,DSN=**$2**                                       00060036 >> q36271044.txt
echo(//REPORT   DD SYSOUT=*                                                  00070036 >> q36271044.txt
echo(//SYSPRINT DD SYSOUT=*                                                  00080036 >> q36271044.txt
echo(//SYSIN    DD *                                                         00090036 >> q36271044.txt
echo(OPTIONS  LINESIZE=90 ERROR=1 PAGESIZE=32767 PAGENO=1 NUMBER NODATE      00100036 >> q36271044.txt
echo(  SYMBOLGEN NOLABEL MISSING='' COMPRESS=YES                             00110036 >> q36271044.txt
echo(  OBS=MAX REPLACE FORMDLIM='-' FORMCHAR='^|-,???+????+=^|-/\^<^>*';         00120036 >> q36271044.txt
echo(                                                                        00130036 >> q36271044.txt
echo(                                                                        00140036 >> q36271044.txt
echo(DATA _NULL_;                                                            00150036 >> q36271044.txt

TYPE "q36271044.txt"

ECHO =====================================
DEL "q36271044.txt*" 2>NUL

(
 echo(//**$1** JOB 99999,'IMS-MXG',CLASS=3,REGION=100M,                       00010026
 echo(//             MSGCLASS=Z,MSGLEVEL=(1,1^),NOTIFY=^&SYSUID                 00020036
 echo(//JCLLIB JCLLIB ORDER=(SCBP.MXG.JCLLIB^)                                 00030036
 echo(//MYSTEP EXEC MXGSAS,WORK='1500,500',                                   00040036
 echo(//       OPTIONS='PRINT=REPORT SYSPARM="SITE=CA,ZONE=PRIME"'            00050036
 echo(//DETAIL   DD DISP=SHR,DSN=**$2**                                       00060036
 echo(//REPORT   DD SYSOUT=*                                                  00070036
 echo(//SYSPRINT DD SYSOUT=*                                                  00080036
 echo(//SYSIN    DD *                                                         00090036
 echo(OPTIONS  LINESIZE=90 ERROR=1 PAGESIZE=32767 PAGENO=1 NUMBER NODATE      00100036
 echo(  SYMBOLGEN NOLABEL MISSING='' COMPRESS=YES                             00110036
 echo(  OBS=MAX REPLACE FORMDLIM='-' FORMCHAR='^|-,???+????+=^|-/\^<^>*';         00120036
 echo(                                                                        00130036
 echo(                                                                        00140036
 echo(DATA _NULL_;                                                            00150036
)>q36271044.txt

TYPE "q36271044.txt"

GOTO :EOF

Two different ways to do it (and you didn't mention the syntax-error reports) 两种不同的处理方式(您没有提到语法错误报告)

In the first, redirectors and other characters with special meaning need to be escaped, that is |><& require a leading ^ . 首先,重定向器和其他具有特殊含义的字符需要转义,即|><&需要前导^

In the second, there is a technique of creating the file containing the echo ed output without perpetually appending. 在第二种中,有一种技术可以创建包含echo输出的文件,而无需永久附加。 The syntax 语法

(
a series of statements
)>filename

creates the file but you also require to escape ) as it's all within parentheses. 创建文件, 您也需要转义)因为它们都在括号内。

% needs to be escaped by % not ^ . %需要通过% not ^转义。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM