首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Batch -如何在延迟扩展的if中用表达式替换感叹号?

Batch -如何在延迟扩展的if中用表达式替换感叹号?
EN

Stack Overflow用户
提问于 2018-06-05 05:06:52
回答 3查看 413关注 0票数 1

为了 parameter values,我需要更改一个字符串,该字符串需要用一个表达式替换感叹号,以便在稍后的过程中对这些感叹号进行转义。当前的解决方案在if中不起作用。下面的工作脚本很好地说明了这个问题:

代码语言:javascript
复制
@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中工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:32:57

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

代码语言:javascript
复制
@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/循环主体时,使用子例程。

票数 0
EN

Stack Overflow用户

发布于 2018-06-05 16:39:32

如果您改变了思路,使用IF …而不是IF NOT …(,那么就不会有这个问题,因为您不需要在块中设置变量:

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2018-06-05 16:53:35

类似于Compo的答案,但这个方法也适用于多个返回变量。

代码语言:javascript
复制
IF defined string (
  SET "return1=!string:"=""!"
)
IF defined string (
    SET "return1=%return1:!=^^^!%"
    SET "return1=!return1:""="!"
)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档