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

时间:2016-03-28 20:57:23

标签: windows batch-file echo

我正在寻找从bat文件生成动态SAS文件,以便我可以从命令行传入一些变量。我希望这样做,

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

得到这个,

//**$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

但是,这就是我所得到的,

  //**$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

注意缺少第2,12,13和14行。我可能需要考虑逃避第12行中的一些角色,但其他一些线条让我对他们为什么没有出现感到无能为力。

有没有办法逐字回复这些行?

非常感谢。

3 个答案:

答案 0 :(得分:0)

在Windows 7上的批处理文件中尝试了这个,它显示了所有的空格。您使用的是哪个版本的Windows?你确定那些是空格或标签吗?

答案 1 :(得分:0)

使用echo.代替echo
这将保留你的领先空白,并且还可以保护你免受你想要回复'@'符号的情况(echo@ ...有特殊解释,但echo。不会预先设置{ {1}}并且是安全的)

'.'

答案 2 :(得分:0)

@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

两种不同的方法(并没有提到语法错误报告)

首先,需要转发具有特殊含义的重定向器和其他字符,即|><&需要前导^

在第二种方法中,有一种技术可以创建包含echo ed输出的文件而无需永久附加。语法

(
a series of statements
)>filename

创建文件您还需要转义),因为它都在括号内。

%需要%而非^转义。