批处理 - 如何在延迟暂停的情况下将感叹号替换为表达式?



为了返回参数值,我需要更改一个字符串,该字符串需要用表达式替换感叹号,以便在该过程的后期对这些感叹号进行转义。当前解决方案在 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 中工作?

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

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

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

该字符串现在将具有预转义的感叹号,可供后续处理。

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

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

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

最新更新