我将变量设置为值。我想用反引号(`)转义字符串中的多个字符。以下是使用反引号替换括号出现的示例:
@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
但它不起作用。任何建议赞赏.....
答案 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 variable和Why 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"
请注意,由于批量处理某些字符的特殊含义,此技术存在一些限制。