Пакетный режим - выход знака «больше» не работает - PullRequest
0 голосов
/ 10 июня 2018

В следующем скрипте я передаю строку в кавычках в подпрограмму и кавычки (с тильдой при доступе к параметру), чтобы вывести ее без кавычек.К сожалению, моя попытка сбежать больше, чем знак (и) не работает:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
    set foo="Argument -> Not provided^!"
    call :output_actual_error !foo!

    ENDLOCAL
EXIT /B 0

:output_actual_error
    SETLOCAL DISABLEDELAYEDEXPANSION
    set bar=%~1
    set bar=%bar:>=^>%
    echo %bar%
    ENDLOCAL
EXIT /B 0

Вывод:

Argument - provided!

Ожидаемый:

Argument -> Not provided!

Пожалуйста, имейте в видучто код только для иллюстрации и НЕ представляет фактическую реализацию.

Итак, как можно избежать знака больше чем и echo строки без двойного?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Решение уже предоставлено этим ответом .Тем не менее, я хочу показать вам, как я написал бы код, чтобы сделать его максимально безопасным от всех комбинаций всех видов специальных символов, используя правильные кавычки, включая и применяя отложенное расширение только там, где это действительно необходимо, и отключая его там, где это необходимо.это тревожно или небезопасно:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem /* No delayed expansion during immediate variable assignment,
rem    so escaping of exclamation marks is not required;
rem    quotation in a way not to become part of the value: */
set "foo=Argument -> Not provided!"
setlocal EnableDelayedExpansion
rem /* Delayed expansion during reading of variable;
rem    quote argument value here to protect white-spaces: */
call :output_actual_error "!foo!"
endlocal
endlocal
exit /B 0


:output_actual_error
    rem /* No delayed expansion during argument expansion (%);
    rem    quotation in a way not to become part of the value: */
    setlocal DisableDelayedExpansion
    set "bar=%~1"
    setlocal EnableDelayedExpansion
    rem // Delayed expansion during reading of variable:
    echo(!bar!
    endlocal
    endlocal
    exit /B 0

Это в основном позволяет избежать отложенного расширения во время присваивания переменной и%-расширения и использует отложенное расширение всякий раз, когда переменная читается.

По-прежнему сохраняются риски сбоя:

  1. Один вводится call, потому что он удваивает кавычки (^).
  2. Другой представлен расширением аргумента (%~1), которое можетвызвать проблемы с кавычками, особенно когда они кажутся несбалансированными.
0 голосов
/ 10 июня 2018

Использование

set "bar=%~1"
set "bar=%bar:>=^>%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...