阅读一些内容,但是努力使我的脑袋绕开。基本上,必须使用Setlocal启用和禁用延迟扩展才能使用和操作带有感叹号的变量。下面的代码示例。代码段可以在一个会话中循环多次,并且在某个时刻(我相信是32位?),我收到“达到最大setlocal递归级别”错误。
我已经阅读了一些有关Endlocal的内容,但无法理解如何使用它。我担心的是,代码提取的某些部分(如下)使用了周围代码中的环境变量(例如%_emuExts%),而提取中设置了一些我想在提取之外使用的变量(例如,%launchfile%和% lauchfile2%)。希望这有点道理!
我的问题实际上是在哪里放置任何EndLocal,以确保可以在代码“周围”使用变量,并设置可以在“本地”位之外使用的变量。老实说-努力围绕“本地”和“递归级别”概念化概念
代码:
:: Example of var contents:
set _emuExts=cue bin iso
:: Problem code:
Setlocal DisableDelayedExpansion
for %%e in (%_emuExts%) do (
echo Extention: %%e
for /F "delims=" %%a in ('dir /b *.%%e') do (
set launchfile=%%~na.%%e
echo Launchfile this iteration: [%%~na.%%e]%_log1%
)
echo Next iteration......
)
echo Final Launchfile: "%launchfile%" %_log1%
set launchfile2=%launchfile:!={-exc-}%
echo Launchfile with replace: %launchfile2%%_log1%
setlocal enabledelayedexpansion
:: .....more code
Setlocal DisableDelayedExpansion
set "_FinalemuCmd=%_FinalemuCmd:{-exc-}=!%"
start /wait "" "%_emuExe%" %_FinalemuCmd%
setlocal enabledelayedexpansion
:: ...continues....
从功能上讲,此操作通过%_emuExts%中指定的扩展范围在当前目录中循环,并将%launchfile%设置为“优先”文件扩展名(最右边的扩展名)。某些文件名中带有感叹号-因此延迟了扩展切换。然后切换为“!”代表“ {-exc-}”
道歉-对你们来说可能很明显-但很难解决。谢谢
最佳答案
可以对代码进行修改,而不是使所有SETLOCAL复杂化,而无需启用延迟扩展吗?我没有看到上面需要它的任何代码。当然,缺少代码。也许我们应该看看。如果必须多次SETLOCAL,则有一种称为“隧道”的技术,该技术使您可以将一个代码节中局部的变量传递给另一代码节。为此,您可以执行类似endlocal & set MyVar=%MyVar%
的操作。之所以可行,是因为在加载时会分析整个行,并扩展%MyVar%。然后,运行时行为是将该值设置为本地化代码之外的新变量(您可以选择相同或不同的名称)。