[英]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.