-1

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

这就是我想要实现的目标: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% 等...

这对我有用,但我喜欢改进/简化我的脚本的建议?

4

2 回答 2

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 时失败。

于 2013-10-30T01:34:41.810 回答
0

建议:

用于for /d /r处理递归

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

如果按照 npocmaka 的建议串联在行长度的限制内,并且如果最终应用程序支持,则用户短路径。此外,不要在包含 for 循环的同一指令(不是行)中添加新值,而是使用对子程序的调用,并将新值传递给它,然后附加该值。它更慢,但执行的命令行会更短。

于 2013-10-29T21:14:04.000 回答