批处理 - 从变量中递归目录并在另一个变量中展开结果

时间:2013-10-29 19:36:56

标签: batch-file cmd

我正在为工作创建一个简单的生产环境,这样做需要在批处理文件中为特定项目设置特定的环境变量。

这是我想要实现的目标: 1)定义一个环境变量,用于定义目录列表 2)递减每个目录并将所有叶文件夹添加到最终环境变量。

[编辑]回顾我最初发布的内容后,我能够删除一些冗余。但“输入线太长了”。 %LINE%变得太长时发生错误。使用短路径扩展确实有帮助,但它仍然可能出错。我将看看如何按照建议将回声中断到临时文件。

这是我目前所拥有的:

@echo off

set RECURSE_THESE_DIRS=C:\Users\eric\Autodesk

set TMP_FILE=%CD%TMP_FILE.%RANDOM%.txt
setLocal EnableDelayedExpansion
for %%i in (%RECURSE_THESE_DIRS%) do (
    if exist %%~si\NUL (
        for /f "tokens=*" %%G in ('dir /b /s /a:d %%i') do set LIST=!LIST!;%%G
    )
)

set LIST=%LIST:~1%

rem !!! AT THE ECHO LINE BELOW IF %LIST% IS TOO LONG, THIS SCRIPT FAILS
rem !!! WITH The input line is too long. ERROR :(
echo %LIST%>%TMP_FILE%
endlocal

for /F "delims=" %%G in (%TMP_FILE%) do set FINAL_VAR=%%G
del /F %TMP_FILE%

因此,通过将RECURSE_THESE_DIRS设置为我要解析的目录,我最终得到一个%FINAL_VAR%,我可以使用它来指定我使用的专有软件的路径。或者我可以使用此脚本附加到%PATH%等...

这适合我,但我会喜欢改善/简化我的脚本的建议吗?

2 个答案:

答案 0 :(得分:1)

你的问题的根源是批量限制为使变量名称,内容和=适合8192字节,因此你的目录列表根本不适合一个变量。

就个人而言,我只是将dir/s/b/a-d列表吐出到临时文件并使用for/f "delims="处理该文件 - 毕竟,您可能需要处理;在你提议执行的任何过程中,分离的envvar都是类似的。

例如,这是一个产生相同错误的测试 - 根本不使用文件名

@ECHO OFF
SETLOCAL
SET "var=hello!1234"
SET var=%var%%var%%var%%var%%var%
SET var=%var%%var%%var%%var%%var%%var%%var%%var%
SET var=%var%%var%%var%%var%%var%
SET var=%var%%var%%var%%var%
SET count=8000
:loop
SET /a count +=1
ECHO %count%
SET var=%var%x
ECHO %var%
GOTO loop
GOTO :EOF

如果count = 8184,这应该会失败。

答案 1 :(得分:0)

建议:

使用for /d /r来处理递归

也许我错了,但是在你的脚本中,你遍历目录层次结构,将每个目录添加到临时文件,然后将其重新连接以将其行连接成一个变量,然后将其写入临时文件,以便再次读取另一个变量。如果目录的连接适合变量,为什么不连接它们而没有任何临时文件?

如果连接在行长度的限制内,如npocmaka所建议,并且如果是最终应用程序,用户短路径。此外,不是在包含for循环的同一指令(不是行)中添加新值,而是使用对传递给它的新值调用subrutine,然后追加该值。它的速度较慢,但​​执行的命令行会更短。