为了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内部工作?
答案 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:""="!"
)
它将代码分成两个单独的块,因此百分比扩展将起作用