Неожиданная функция CALL с перенаправлением

У меня возникла проблема с script, поэтому я пошел в ss64.com, как обычно, чтобы узнать, какие драгоценности я могу найти, чтобы помочь мне.

При просмотре страницы команда CALL Я наткнулся на эту строку:

Перенаправление с и | <> также не работает должным образом.

Однако эта страница и почти где-нибудь еще, что я смотрел, не объясняют, как это работает неожиданно. Я знаю, что | может делать некоторые неожиданные вещи вообще, но я не знаю других.

Что это за неожиданная функция? Это зависит от того, как вы используете команду CALL (вызов метки vs script)?

1 ответ

Я полагаю, что Роб думает о таких вещах:

call :func | more
exit /b
:func
echo line1
echo line2
exit /b

Или что-то вроде

setlocal EnableDelayedExpansion
set var=Line2
( echo Line1
echo !var! ) | more

Для этого объяснение можно найти в (вы упомянули это) SO: Почему задержка с расширением заканчивается, если внутри блока кода с каналами?

Но перенаправление на первом шаге работает с CALL, как и ожидалось (и другими символами)

call echo Hello > output.txt

Но если вы попытаетесь использовать любой из специальных символов во втором расширении команды CALL, полная команда не будет выполнена. О специальных эффектах CALL для парсерного парсера описывается на сайте SO: Как скрипты синтаксического анализа CMD.EXE? (особенно этап 6)

set "myCmd=echo 1 & echo 2"
call %%myCmd%%

Двойной %% приводит к тому, что первое расширение приводит к %myCmd%, и реальное расширение содержимого будет выполнено только до второго прогона синтаксического анализатора, поэтому & нужно интерпретировать в CALL контекст.

А также это не приведет к чему-либо (из-за скобки)

set "myCmd=echo Line1"
call (%%myCmd%%)

Но это будет , очевидно, вызовет командный файл с именем 1.bat

echo echo Hello > 1.bat
set "myCmd=echo Line1 && echo Line2"
call (%%myCmd%%)
echo End

Это обсуждалось в dostips: CALL me, или лучше избегать вызова В настоящее время я полагаю, что CALL работает как-то с токенами, но не может обрабатывать их правильным образом.

licensed under cc by-sa 3.0 with attribution.