【问题标题】:Batch - How to replace exclamation mark with expression in if with delayed expension?批处理 - 如果延迟扩展,如何用表达式替换感叹号?
【发布时间】:2018-11-14 06:32:45
【问题描述】:

为了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 中工作?

【问题讨论】:

  • 您希望这个脚本能做什么?你能显示一个示例输出吗?
  • @jwdonahue 请参阅thismy 问题的回答,但字符串和FOR ... 部分的操作在IF 中。这个问题甚至提供了一个示例,只需在注释块中添加注释...

标签: batch-file cmd scripting windows-scripting


【解决方案1】:

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

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

【讨论】:

  • 我知道我可以使用子程序,但我更喜欢使用该语言的所有技巧......
【解决方案2】:

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

该字符串现在将具有预先转义的感叹号,为您以后的处理做好准备。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 有没有其他方法可以使用一些棘手的双延迟扩展,以便在 if (...) 中保持一致?
    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多