Пакет - Как отобразить восклицательный знак внутри строки, переданной в качестве параметра подпрограмме? - PullRequest
0 голосов
/ 19 мая 2018

У меня есть следующий скрипт:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

SET /A countArgs=1

FOR %%p in (%pathListToCheck%) DO (
    IF NOT EXIST %%p (
        CALL :error "!countArgs!. Argument -> bla!"
        EXIT /B 1
    )
    SET /A countArgs+=1
)

:error
    ECHO ERROR  
    set x=%~1
    ECHO !x!
EXIT /B 0

К сожалению, восклицательный знак не получает echo d.Я также пытался избежать этого, как ^! и ^^!, но он не работает.

Я использую отсроченные затраты здесь, чтобы заставить работать знак больше (>).Если бы я попытался ECHO параметр напрямую (ECHO %~1), он потерпел бы неудачу.Подробнее см. Мой предыдущий вопрос

Как это можно исправить?

Я ценю вашу помощь ...

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Если вы избегаете восклицательного знака и dis в состоянии отложенного расширения внутри функции , это работает (хотя и удаляет «отложенную» альтернативу - которая вам все равно не понравилась)

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET /A countArgs=2
CALL :error "!countArgs!. Argument -> bla^!"
EXIT /B 1

:error
  setlocal disabledelayedexpansion
    for /f "delims=" %%a in ("%~1") do echo for:      %%a
    echo quoted:  "%~1"
  endlocal
EXIT /B 0
0 голосов
/ 19 мая 2018

Вы не прочитали / не поняли резюме Стефана в его ответе .
setlocal enabledelayedexpansion - причина исчезнувших восклицательных знаков.
Нет смысла использовать его в вашем настоящемкод.

Если вы хотите повторить <|>& без кавычек, вы должны их избежать.Это можно сделать с помощью кода.

:: Q:\Test\2018\05\19\SO_50419709.cmd
@Echo off
SetLocal EnableExtensions DisableDelayedExpansion

SET /A countArgs=1

set "pathlisttocheck=%userprofile%,x:\x\x\"
FOR %%p in (%pathListToCheck%) DO (
    IF NOT EXIST %%p (
        CALL :error "%%countArgs%%. Argument -> bla!  %%~p"
        EXIT /B 1
    )
    SET /A countArgs+=1
)
EXIT /B 1

:error
ECHO ERROR  
set "x=%~1"
set "x=%x:>=^>%"
ECHO %x%
EXIT /B 0

Пример вывода:

> Q:\Test\2018\05\19\SO_50419709.cmd
ERROR
2. Argument -> bla! x:\x\x\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...