批处理 - 如果延迟扩展,如何用表达式替换感叹号?

时间:2018-06-04 21:06:52

标签: batch-file cmd scripting windows-scripting

为了return parameter values我需要更改一个字符串,该字符串需要用表达式替换感叹号,以便稍后在过程中转义这些感叹号。目前的解决方案并不适用于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 :(得分:0)

避免在批处理脚本中使用多行语句。它不仅难以使它们正确,它们在开发代码时很难调试。当您需要在变量替换表达式中使用变量时,延迟扩展最有用。这是您的代码的简单方法:

@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实体时,请使用子例程。

答案 1 :(得分:0)

如果你颠倒了自己的想法,而不是使用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

该字符串现在具有预先转义的惊叹号,可供您以后的处理。

答案 2 :(得分:0)

与Compo的答案一样,但这个也适用于多个返回变量。

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

它将代码分成两个单独的块,因此百分比扩展将起作用