1

我制作了一个 bat 脚本,应该将文件夹列表复制到一个变量中,但我在变量中没有得到任何东西。换句话说,当我在我的 for 循环之后回显变量时,我得到了预期的输出,但是在执行脚本之后的 shell 中,我没有看到我的变量中设置的任何内容。如何让所有变量正确复制?

我正在使用 Windows 7。

批处理文件(script.bat):

@echo off
setlocal enabledelayedexpansion enableextensions

for /r /D %%x in (*) do (
    SET PATH_VALUE=%%x;!PATH_VALUE!
)    
echo %PATH_VALUE%

windows cmd 实用程序的输出

C:\test> script.bat
C:\test\1;C:\test\2

C:\test> echo %PATH_VALUE%
%PATH_VALUE%

如何获取 %PATH_VALUE% 作为环境变量?我在这里发现了一个类似的问题,但它并不能完全回答我的情况。

4

1 回答 1

2

那是因为SETLOCAL您用于启用延迟扩展的命令。是的,它提供了您需要的延迟扩展,但它也本地化了环境变化。一旦你的批处理脚本结束,就会有一个隐式的ENDLOCAL,并且旧环境被恢复。

您可以通过将以下内容添加到脚本末尾来跨 ENDLOCAL 屏障传递值:

endlocal&set "PATH_VALUE=%PATH_VALUE%"

或者你可以这样写:

(
  endlocal
  set "PATH_VALUE=%PATH_VALUE%"
)

上述两种方法都有效,因为代码块在 ENDLOCAL 执行之前被扩展和解析,但是具有扩展值的 SET 语句在 ENDLOCAL 之后执行。

于 2013-09-04T21:07:43.867 回答