批处理:在多个for循环中多次使用变量

时间:2017-10-29 05:43:08

标签: batch-file for-loop

在我的批处理文件中,我有几个for循环。

exampleInputDir\weapon\%character%\thing1
                                  \thing2
                                  \thing3

每个#vers文件夹都包含一个motion.mtable文件

FOR /R "C:\exampleInputDir\weapon\%character%\" %%G IN (motion.mtable) DO (
    FOR %%b in ("%%~dpG\.") DO set "weaponname=%%~nxb"
    FITD -le "%G%" -o "C:\exampleOutputDir\%character%\%weaponname%"
    )

如果我不清楚我想要做什么,我需要多次使用%G%变量,对于其中一个时间,我需要稍微改变并放入另一个变量所以我可以在一个命令中调用它两次。

如果有什么事情不清楚,请告诉我,我会尽力澄清! 谢谢!

编辑:我希望最后一个命令是:

FITD -le "exampleInputDir\weapon\%character%\thing#\motion.mtable" -o "C:\exampleOutputDir\%character%\thing#"

我希望命令能够通过thing1,thing2和thing3

运行

1 个答案:

答案 0 :(得分:0)

FITD -le "%G%" -o "C:\exampleOutputDir\%character%\%%~nxb"

因为weaponname%%~nxb的目的是相同的。

你和许多其他人一样陷入delayedexpansion陷阱。 SO上有数百个示例 - 只需使用search工具。

您也可以使用delayedexpansion来解决问题

setlocal enabledelayedexpansion
FOR /R "C:\exampleInputDir\weapon\%character%\" %%G IN (motion.mtable) DO (
    FOR %%b in ("%%~dpG\.") DO set "weaponname=%%~nxb"
    FITD -le "%G%" -o "C:\exampleOutputDir\%character%\!weaponname!"
    )
endlocal

使用setlocal/endlocal括号启用delayedexpansion,从而能够访问在code block内修改的变量的运行时值(或括号内)线序列。)

优点 - 允许通过!var!代替%var%访问变量的运行时值(%var%已解析为解析时间值)

缺点 - 对于cognescenti
- 在括号内建立或修改的值仅在括号结束之前存在 - 具有修改后的含义,需要特别注意