通过另一个扩展变量内部的扩展变量

通过另一个扩展变量内部的扩展变量

在批处理文件中,有没有办法通过变量替换将一个扩展变量插入到另一个扩展变量中?例如...

假设有 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!"

其他资源:

答案2

您可以使用由启用的第二个扩展机制来实现 启用延迟扩展

下面的脚本是一个示例,我将其放在名为的文件中test.bat

@echo off
setlocal enabledelayedexpansion
set first=second
set second=third
set var1=!%first%!
echo !var1!

以下是概念证明:

在此处输入图片描述

您可以在帖子中找到更多示例 如何两次扩展 CMD shell 变量(递归)

相关内容