为了 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中工作?
发布于 2018-06-05 05:32:57
避免在批处理脚本中使用多行语句。不仅仅是让它们正确,它们在开发代码时也很难调试。当您需要在变量替换表达式中使用变量时,延迟扩展最有用。以下是您的代码的简单方法:
@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/循环主体时,使用子例程。
发布于 2018-06-05 16:39:32
如果您改变了思路,使用IF …
而不是IF NOT …(
,那么就不会有这个问题,因为您不需要在块中设置变量:
@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
字符串现在将具有预先转义的感叹号,可用于以后的处理。
发布于 2018-06-05 16:53:35
类似于Compo的答案,但这个方法也适用于多个返回变量。
IF defined string (
SET "return1=!string:"=""!"
)
IF defined string (
SET "return1=%return1:!=^^^!%"
SET "return1=!return1:""="!"
)
它将代码拆分为两个独立的块,因此百分比扩展将起作用
https://stackoverflow.com/questions/50688776
复制相似问题