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

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

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

    SET string="World^! wasserschutzpolizei^!"

    REM REM Works quite well here!
    REM SET "return1=!string:"=""!"
    REM SET "return1=%return1:!=^^^!%"
    REM SET "return1=!return1:""="!"
    REM ECHO !return1!

    IF NOT "!string!"=="" (
        SET "return1=!string:"=""!"

        REM This line doesn't work because of the % % inside the if...
        REM Because it is one logical line.
        SET "return1=%return1:!=^^^!%"
        SET "return1=!return1:""="!"

        ECHO !return1!
    )

    EXIT /B 0
ENDLOCAL

У меня был один нерабочий подход, который использует CALL SET:

CALL SET "return1=%%return1:!=^^^!%%", но это не работает.

Что касается ответа, учтите, что для других вещей мне также нужно отложить расходы.

Итак, как мне нужно изменить код, особенно строку SET "return1=%return1:!=^^^!%", чтобы он работал внутри if?

Ответы [ 3 ]

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

Если бы вы изменили свое мышление и вместо IF NOT …( использовали IF …, у вас не было бы этой проблемы, поскольку вы бы не устанавливали переменные внутри блока:

@ECHO OFF
SET "string=World! wasserschutzpolizei!"

IF "%string%"=="" EXIT /B 1

SET "return1=%string:"=""%"
SET "return1=%return1:!=^^^!%"
SET "return1=%return1:""="%"
ECHO %return1%

PAUSE
EXIT /B 0

Строка теперь будет иметь предварительно экранированные восклицательные знаки, готовые для вашего последующего процесса.

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

Как и ответ Compo, но этот работает также для более чем одной возвращаемой переменной.

IF defined string (
  SET "return1=!string:"=""!"
)
IF defined string (
    SET "return1=%return1:!=^^^!%"
    SET "return1=!return1:""="!"
)

Он разбивает код на два отдельных блока, поэтому процентное расширение будет работать

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

Избегайте использования многострочных операторов в пакетных скриптах.Это не просто сложно понять их правильно, их сложно отлаживать при разработке кода.Отложенное расширение наиболее полезно, когда вам нужно использовать переменные в выражениях замены переменных.Вот ваш код простым способом:

@setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@set prompt=$G

set input="World^! wasserschutzpolizei^!"

@rem Works quite well here!
@set "return1=!input:"=""!"
@set "return1=%return1:!=^^^!%"
@set "return1=!return1:""="!"
@echo %return1%

@if not "!input!"=="" call :DoIt
@echo %return1%
@exit /b 0

:DoIt
@set "return1=!input:"=""!"
@set "return1=%return1:!=^^^!%"
@set "return1=!return1:""="!"
@exit 

Используйте подпрограммы, когда короткое простое выражение нельзя использовать для тел if / loop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...