Highcharts стиль компас диаграммы

Существуют методы, которые избегают escape-последовательностей ^.

Вы можете использовать переменные с задержкой расширения. Ниже представлен небольшой демонстрационный скрипт

@echo off
setlocal enableDelayedExpansion
set "line="
echo !line!

. Или вы можете использовать цикл FOR / F. Из командной строки:

for /f "delims=" %A in ("") do @echo %~A

Или из пакетного сценария:

@echo off
for /f "delims=" %%A in ("") do echo %%~A

Причина, по которой эти методы работают, состоит в том, что как замедленное расширение, так и расширение переменной FOR происходят после того, как специальные операторы, такие как <, >, &, |, &&, || разобраны. См. . Как интерпретатор сценариев Windows (CMD.EXE) анализирует сценарии? для получения дополнительной информации.


sin3.14 указывает, что для труб может потребоваться несколько экранов . Например:

echo ^^^|findstr .

Труды причин требуют нескольких экранов, потому что каждая сторона канала выполняется в новом CMD-процессе, поэтому строка обрабатывается несколько раз. См. . Почему задержка с расширением заканчивается, когда внутри блок кода кода? для объяснения многих неудобных последствий реализации канала Window.

Существует еще один способ избежать множественных экранов при использовании трубы. Вы можете явно создать свой собственный CMD-процесс и защитить одиночный побег с помощью кавычек:

cmd /c "echo ^"|findstr .

Если вы хотите использовать технику с задержкой расширения, чтобы избежать побегов, то есть еще больше сюрпризов (вы не можете если вы являетесь экспертом по дизайну CMD.EXE, но нет официальной документации MicroSoft, которая объясняет этот материал)

Помните, что каждая сторона канала выполняется в своем собственном процессе CMD.EXE , но процесс не наследует отложенное состояние расширения - по умолчанию он отключен. Таким образом, вы должны явно создать экземпляр собственного процесса CMD.EXE и использовать параметр / V: ON, чтобы включить замедленное расширение.

@echo off
setlocal disableDelayedExpansion
set "line="
cmd /v:on /c echo !test!|findstr .

Обратите внимание, что замедленное расширение выключено в родительском пакетном скрипте.

Но все ад разрывается, если в родительском скрипте включено замедленное расширение. Ниже показано not :

@echo off
setlocal enableDelayedExpansion
set "line="
REM - the following command fails
cmd /v:on /c echo !test!|findstr .

Проблема заключается в том, что !test! расширяется в родительском скрипте, поэтому новый процесс CMD пытается разобрать незащищенные < и >.

Вы можете избежать !, но это может стать сложным, потому что это зависит от того, цитируется ли ! или нет.

Если не указано , тогда требуется двойной escape:

@echo off
setlocal enableDelayedExpansion
set "line="
cmd /v:on /c echo ^^!test^^!|findstr .

Если указано, то используется один побег:

@echo off
setlocal enableDelayedExpansion
set "line="
cmd /v:on /c "echo ^!test^!"|findstr .

Но есть удивительный трюк, который позволяет избежать всех экранов - левая сторона трубы препятствует преждевременному расширению родительского скрипта !test!:

@echo off
setlocal enableDelayedExpansion
set "line="
(cmd /v:on /c echo !test!)|findstr .

Но я полагаю, что даже это не бесплатный обед, потому что парсерный парсер вводит дополнительное (возможно, нежелательное) пространство в конец, когда используются круглые скобки.

Aint batch scripting fun; -)

1
задан Christian Påbøl Jacobsen 19 March 2019 в 17:51
поделиться