我正在为工作创建一个简单的生产环境,这样做需要在批处理文件中为特定项目设置特定的环境变量。
这是我想要实现的目标: 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%等...
这适合我,但我会喜欢改善/简化我的脚本的建议吗?
答案 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,然后追加该值。它的速度较慢,但执行的命令行会更短。