在批处理文件中,有没有办法通过变量替换将一个扩展变量插入到另一个扩展变量中?例如...
假设有 2 个文件(fileone.dll 和 filetwo.dll),情况如下:
for /f "tokens=1,2 delims=" %%a in ('dir "c:\users\default\desktop\*.dll" /b') do @(
set var1=%%a
set var2=%%b
set var1=!var1:.dll=!var2!.dll!
)
这样,!var1! 就不会被设置为 fileone.dll,而是 fileonefiletwo.dll。这样说有道理吗?
提前致谢
答案1
有没有办法在批处理文件中通过变量替换将一个扩展变量插入到另一个扩展变量中?...
%%b
所以var2
每次都会是空的。你没有第二个 token"delims="
–@Sephan
你的问题是使用for
循环,选择未明确定义的标记 1 和 2(参见@Sephan在您的文件夹中有 2 个文件,则"tokens=1,2 delims="
当前循环正在执行代码所命令的操作:
- 第一个循环中只使用
for
列出的第一个文件名,即文件fileone.dll
:
for /f "tokens=1,2 delims=" %%a in ('dir "c:\users\default\desktop\*.dll" /b') do @(
set var1=%%a is the same == > set var1=fileone.dll == > set var1=first output file name.ext in loop
set var2=%%b is the same == > set var2= n o t h i n g == > removes a var2 that has not even been defined
set var1=!var1:.dll=!var2!.dll! == > set var1=var1:replace_string=to_string == > set var1=fileone:.dll=.dll == > set var1=fileone.dll
)
- 第二个循环中仅使用
for
列出的第二个文件名,即文件filetwo.dll
:
for /f "tokens=1,2 delims=" %%a in ('dir "c:\users\default\desktop\*.dll" /b') do @(
set var1=%%a is the same == > set var1=filetwo.dll == > set var1=second output file name.ext in loop
set var2=%%b is the same == > set var2= n o t h i n g == > removes a var2 that has not even been defined
set var1=!var1:.dll=!var2!.dll! == > set var1=var1:replace_string=to_string == > set var1=filetwo:.dll=.dll == > set var1=filetwo.dll
)
考虑到您的场景和所需的子字符串的建议:
假设有 2 个文件(fileone.dll 和 filetwo.dll),情况如下:
- 这样,!var1! 就不会被设置为 fileone.dll
@echo off
for /f %%a in ('dir "c:\users\default\desktop\*.dll" /b'
)do if not defined var1 (set "var1=%%~a")else set "var2=%%~a"
echo. & echo. var1 and var2: var1 == %var1% - var2 == %var2%
echo. & echo= set substring: set "var1=!var1:.dll=%%var2%%.dll!"
echo. & cmd /v:on /c set "var1=!var1:.dll=%var2%.dll!"
echo= var1 and var2 expanded: var1 == %var1% - var2 == %var2%
- 输出/结果:
var1 and var2: var1 == fileone.dll - var2 == filetwo.dll
set substring: set "var1=!var1:.dll=%var2%.dll!"
var1 and var2 expanded: var1 == fileone.dll - var2 == filetwo.dll
- 使用延迟扩张当你需要它对你的变量产生影响时,否则你的子字符串将毫无意义。
cmd /v:on Expand variables at execution time rather than at parse time.
echo. & cmd /v:on /c set "var1=!var1:.dll=%var2%.dll!"
其他资源:
For /?
For /F
If ()Else IF () Else ()
CMD /V:on|off /E:on|off ... /?
- 变量和子字符串操作
- Windows 命令解释器如何
cmd.exe
解析脚本 SETLOCAL
和如何ENABLEDELAYEDEXPANSION
工作?| 参考:CMD /:ON /C
答案2
您可以使用由启用的第二个扩展机制来实现 启用延迟扩展。
下面的脚本是一个示例,我将其放在名为的文件中test.bat
:
@echo off
setlocal enabledelayedexpansion
set first=second
set second=third
set var1=!%first%!
echo !var1!
以下是概念证明:
您可以在帖子中找到更多示例 如何两次扩展 CMD shell 变量(递归)。