-
- @echo off
- for /f "delims=" %%a in ('ipconfig^|findstr /i "Address"') do set var=%%a
- setlocal enabledelayedexpansion
- set CarriageReturn=!var:~-1!
- rem 必须用!!的形式才能得到和输出回车符Cr,否则回车符会被丢弃
- echo +++!CarriageReturn!---
- rem 验证
- echo +++!CarriageReturn!---|find /v ""
- rem 用%%输出,得不到回车符
- echo aaa%CarriageReturn%bbb
- echo aaa%CarriageReturn%bbb|find /v ""
- rem :::::::::::::::::::::::::::::::::::
- rem 换行符Lf,也必须用!!的形式才能输出,否则Lf后面的字符被丢弃
- set NewLine=^
-
- rem :::::::::::::::::::::::::::::::::::
- rem 上面两行直接回车
- rem 虽然文本中转义字符^后面是CrLf两个控制字符,但它们在预处理时(执行语句之前)
- rem 被作为行结束符(Tip:批处理是按行(整行)读取)
- rem 因此实际运行时此行中^后面没有字符了,^是对文本中下一行的字符进行转义
- rem set语句一下行是CrLf两个控制字符,按理说^应该是对Cr转义,从而NewLine应该是CrLf两个字符。
- rem 但下一行还需要一个空行才能结束语句,说明这一行的Lf没有行结束的作用。
- rem 所以如果^是对Cr转义,则Lf应该仍然是原来意义上的控制字符,有行结束的作用。
- rem 则set语句在这一行就结束了,不需要下一行的空行,所以应该Lf是被转义了。
- rem 而Cr被抛弃了,NewLine确实只有一个字符Lf而不是Cr,更不是两个字符CrLf
- rem Cr的被抛弃看来也要归功于预处理(直接在CMD中输入时也要两个空行)。
- rem 再次体现了MS瘟到死使用CrLf两个字符作为行结束符的不统一、不和谐之处!
- rem Linux只需一个空行就够了
- rem $echo \
- rem $(回车)
- rem $(这一行就得到结果了)
- rem :::::::::::::::::::::::::::::::::::
- echo 000!NewLine!111
- rem 用%%输出,得不到换行符
- echo aaa%NewLine%bbb
- echo aaa%NewLine%bbb|find /v ""
- pause
- rem 此时的回车换行符没有表示输入完成(行结束EOL)的作用,只相当于普通字符
- set/p=CrLf!CarriageReturn!!NewLine!
- rem 用%%输出,回车换行符都得不到
- set/p=CrLf%CarriageReturn%%NewLine%
- rem '\r', 1 byte
- set/p=Cr!CarriageReturn!<nul>Cr.txt
- rem '\n', 1 byte
- set/p=Lf!NewLine!<nul>Lf.txt
- rem "\r\n", 2 byte
- set/p=CrLf!CarriageReturn!!NewLine!<nul>CrLf.txt
- pause
- del Cr.txt Lf.txt CrLf.txt
复制代码 包含换行符Lf的字符串交给 for /f 解析时,会将字符串理解为多行文本。 |