Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件:替换函数中的变量值_Batch File_Replace_Command Prompt - Fatal编程技术网

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

Batch file 批处理文件:替换函数中的变量值,batch-file,replace,command-prompt,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 R

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

@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%
我希望使用一个函数替换所有指定的字符(*[]+等)。但我在挣扎。以下是一个例子:

我试过这个:

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

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

但它不起作用。任何建议都值得欣赏。…

当两个
%
符号相邻时,batch会将其解释为
中用于
循环的变量类型(或文字),而不会执行您想要的操作。您可以通过使用延迟扩展和将替换代码放在
中来解决此问题
或者您可以在其自身的唯一变量内设置要替换的值,如下所示:

@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%"
使用此代码:

@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
把双引号放在正确的位置是很重要的。请参阅和上的答案和其他答案,以了解两者之间的区别

set var="value"

我不知道为什么要在环境变量值中插入反勾号作为转义字符,因为如果包含特殊字符的字符串用双引号括起来,则在命令提示符中输入
cmd/?
后,在帮助输出末尾列出的所有特殊字符都将以文字方式解释

并且命令
set
不支持正则表达式替换。因此,有必要进行多次替换,以便用反勾号转义所有特殊字符

最后一个用一个百分号和另一个百分号逃逸的有点棘手。它需要延迟环境变量扩展,并在批处理文件中为每个百分比登录字符串指定2%的符号

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

@ECHO OFF
SETLOCAL
set-ExampleSInstallDir=“C:\Program Files(x86)\Test”
回显%EXAMPLEINSTALLDIR%
调用:myGetFunc示例InstallDir%示例InstallDir%
回显%EXAMPLEINSTALLDIR%
后藤:EOF
:myGetFunc
设置“%~1=%~2”
调用集“%~1=%~1:(=`(%)
后藤:EOF
请注意,这将使用目标变量作为临时变量进行操作

还要注意子例程之前的额外“goto:eof”-否则批处理将继续进入子例程

@ECHO关闭
SETLOCAL
set-ExampleSInstallDir=“C:\Program Files(x86)\Test”
回显%EXAMPLEINSTALLDIR%
调用:myGetFunc示例InstallDir%示例InstallDir%
回显%EXAMPLEINSTALLDIR%
后藤:EOF
:myGetFunc
设置“%~1=%~2”
调用集“%$1=“%%1:(=`(%%)”
后藤:EOF
此版本用于还原
“引号”


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

感谢您的回答。这就是我要寻找的答案。
set "var=value"