Может кто-нибудь подробно объяснить новую рубку в пакетном режиме? - PullRequest
0 голосов
/ 23 мая 2019
@echo off
set NLC=^


set NL=^^^%NLC%%NLC%^%NLC%%NLC%
Usage:
echo There should be a newline%NL%inserted here.

Я посмотрел эту статью здесь, на Stackoverflow, но она не совсем объясняет ту часть, которая беспокоит меня. Я понимаю, что мы можем использовать его как echo The newline is added^%NLC%%NLC%. Большинство мест, где я ищу ответ, показывают использование, но не объясняют его.

Но то, что я хочу знать, это NL=^^^%NLC%%NLC%^%NLC%%NLC%. Я не могу понять, что происходит под капотом, и это беспокоит меня. Почему мы не можем просто сделать NL=^%NL%%NL%? А затем используйте его как echo newline is%NL%before this.

РЕДАКТИРОВАТЬ: Я делал некоторые тесты, но я не могу полностью понять, что происходит. Вот тесты, которые я сделал:

@echo off
REM Creating a newline variable (the two blank lines are required!)
set NLC=^


REM This prints fine. But looks long and ugly.
echo test1^%NLC%%NLC%test2
REM OUTPUT:
REM test1
REM test2

REM Escape the %NLC%
set NL=^%NLC%%NLC%

REM This prints 'test3' but then the parser stops because it encoutners a newline(%NL% is not escaped)
echo test3%NL%test4
REM OUTPUT:
REM test3

REM We can escape the %NL%. This works fine, but this looks long and ugly again.
echo test5^%NL%%NL%test6
REM OUTPUT:
REM test5
REM test6

REM Substitute ^%NLC%%NLC% for %NL%. This prints "test7^" but then parser stops because the first %NLC% is not escaped. 
REM The first "^" in "^^" escapes the second. So we need to escape the first caret in "^^"
echo test7^^%NLC%%NLC%^%NLC%%NLC%test8
REM OUTPUT:
REM test7^

Это та часть, которая смущает меня. Почему echo test9^^^%NLC%%NLC%^%NLC%%NLC%test10 дает другой результат из SET tman=^^^%NLC%%NLC%^%NLC%%NLC% echo test11%tman%test12? Последний не создает пустую строку.

REM First caret escapes the second, so the second is a literal and will be printed. 
REM The third caret escapes the "%NLC%%NLC%" so a we move to a newline. 
REM The 4th caret escapes the second group of "%NLC%%NLC%", creating a blank line.
REM This prints "test9^". Then prints two newlines (creates a blank line).
echo test9^^^%NLC%%NLC%^%NLC%%NLC%test10
REM OUTPUT:
REM test9^
REM 
REM test10

REM This prints fine. Why? Why is no extra caret printed here unlike the previous? 
REM Why doesn't this create a blank line as it did in above example?
SET tman=^^^%NLC%%NLC%^%NLC%%NLC%
echo test11%tman%test12
REM OUTPUT:
REM test11
REM test12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...