批处理文件:替换函数中的变量值

时间:2014-10-25 16:23:06

标签: batch-file replace command-prompt

我将变量设置为值。我想用反引号(`)转义字符串中的多个字符。以下是使用反引号替换括号出现的示例:

@echo off

REM SET EXAMPLE VALUE
set EXAMPLEINSTALLDIR="C:\Program Files(x86)"
echo %EXAMPLEINSTALLDIR%

REM REMOVE QUOTES
set EXAMPLEINSTALLDIR=%EXAMPLEINSTALLDIR:"=%
echo %EXAMPLEINSTALLDIR%

REM REPLACE ( WITH `(
set EXAMPLEINSTALLDIR=%EXAMPLEINSTALLDIR:(=`(%
echo %EXAMPLEINSTALLDIR%

我希望有一个函数来替换所有指定的字符(* [] + etc)。但我很挣扎。从这里找到的示例:http://www.dostips.com/DtTutoFunctions.php

我试过这个:

set EXAMPLEINSTALLDIR="C:\Program Files(x86)\Test"
echo %EXAMPLEINSTALLDIR%
call:myGetFunc EXAMPLEINSTALLDIR %EXAMPLEINSTALLDIR%
echo %EXAMPLEINSTALLDIR%

:myGetFunc
set "%~1=%%~2:(=`(%
goto:eof

但它不起作用。任何建议赞赏.....

3 个答案:

答案 0 :(得分:2)

当你有两个%标志彼此相邻时,批处理会将其解释为for循环内使用的变量类型(或作为文字%)而不是你想要的。您可以通过使用延迟扩展并将替换代码置于!内来解决此问题,或者您可以将值设置为在其自己的唯一变量中替换,如下所示:

@echo off
set example_dir="C:\Program Files(x86)\test"
echo %example_dir%
call :addTick example_dir %example_dir%
echo %example_dir%
exit /b

:addTick
set return_var=%~2
set return_var=%return_var:(=`(%
set "%~1=%return_var%"

答案 1 :(得分:0)

使用此代码:

@echo off

set "EXAMPLEINSTALLDIR=C:\Program Files(x86)"
echo %EXAMPLEINSTALLDIR%

set "EXAMPLEINSTALLDIR=%EXAMPLEINSTALLDIR:(=`(%"
echo %EXAMPLEINSTALLDIR%

set "EXAMPLEINSTALLDIR=%EXAMPLEINSTALLDIR:)=`)%"
echo %EXAMPLEINSTALLDIR%

set "EXAMPLEINSTALLDIR=!EXAMPLEINSTALLDIR:%%=%%%%!"
echo %EXAMPLEINSTALLDIR%

endlocal

在正确的位置加上双引号很重要。请参阅specify redirect location using a variableWhy is no string output with 'echo %var%' after using 'set var = text' on command line?及其他人的回答,了解

之间的区别
set var="value"

set "var=value"

我不知道你为什么要在环境变量值中插入反引号作为转义字符,因为在命令提示符中输入cmd /?后在帮助输出结尾列出的所有特殊字符都会被解释为包含字符串的字符串特殊字符用双引号括起来。

命令set不支持正则表达式替换。因此,需要多次替换才能使用反引号来转义所有特殊字符。

最后一个用百分号转换一个百分号,这有点棘手。它需要延迟环境变量扩展,并为字符串中的每个百分号指定批处理文件中的2%符号。

顺便说一句:环境变量 ProgramFiles(x86)包含65位Windows计算机上32位应用程序的默认程序文件目录的路径。

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
set EXAMPLEINSTALLDIR="C:\Program Files(x86)\Test"
echo %EXAMPLEINSTALLDIR%
call:myGetFunc EXAMPLEINSTALLDIR %EXAMPLEINSTALLDIR%
echo %EXAMPLEINSTALLDIR%
GOTO :EOF

:myGetFunc
set "%~1=%~2"
CALL set "%~1=%%%~1:(=`(%%"
GOTO :EOF

请注意,这会将目标变量用作操作的临时变量

还要注意额外的" goto:eof"在子程序之前 - 否则批处理将简单地继续进入子程序......

@ECHO OFF
SETLOCAL
set EXAMPLEINSTALLDIR="C:\Program Files(x86)\Test"
echo %EXAMPLEINSTALLDIR%
call:myGetFunc EXAMPLEINSTALLDIR %EXAMPLEINSTALLDIR%
echo %EXAMPLEINSTALLDIR%
GOTO :EOF

:myGetFunc
set "%~1=%~2"
CALL set "%~1="%%%~1:(=`(%%""
GOTO :EOF

此版本可恢复"quotes"

请注意,由于批量处理某些字符的特殊含义,此技术存在一些限制。