gpt4 book ai didi

batch-file - 已达到最大 setlocal 递归级别和 endlocal。解决方法?

转载 作者:行者123 更新时间:2023-12-03 17:11:53 24 4
gpt4 key购买 nike

我有一段代码正在执行 0-100,000 次。有问题的 block 显示如下:

FOR /R %%f IN (*.*) DO (
CLS
ECHO Del 2.0
ECHO Files Done^: !FILES_DONE! / !FILES_TOTAL!
ECHO Missing^: !FILES_MISSING!
SETLOCAL DisableDelayedExpansion
SET "FILES_TEMP=%%f"
SETLOCAL EnableDelayedExpansion
IF EXIST "!FILES_TEMP!" (
!DELITE! -p 13 -q "!FILES_TEMP!" >NUL
SET /A FILES_DONE += 1
) ELSE (
SET /A FILES_MISSING += 1
)
)

在这个区 block 中: !FILES_DONE! , !FILES_TOTAL! , 和 !FILES_MISSING!都是整数变量。
!DELITE!是对可执行文件的引用:“!CD!\_sdelete.exe”,其中“!CD!”是执行批处理的根文件夹。

注意:请注意,打开/关闭延迟扩展是必要的,因为我需要捕获可能有也可能没有特殊字符的文件名,例如:“!”和“^”。

所以我的问题是:我怎样才能重新格式化这段代码以不抛出最大递归级别达到错误? (我知道这个问题被问的频率,这只是我的问题的一半,所以请多多包涵)

其次,有人能解释一下这段代码在本地环境中的作用吗?
SETLOCAL EnableDelayedExpansion
FOR /R %%f IN (*.*) DO (
ECHO !FILES_DONE! / !FILES_TOTAL!
ENDLOCAL & (
SET "FILES_TEMP=%%f"
)
[etc...]
)

例如,一旦它在代码中循环一次,'endlocal' 是否仍然有效,还是会因为它是一个新循环而恢复?此外,它是否有助于达到最大 Setlocal 水平?
###########################################################################################
Del 2.0 - 任何想要使用它的人的完整文件内容
注意:如果有人想要 Del Batch 的更新副本,请给我发消息;目前在 V3.0-R0,您需要使用 sdelete.exe command-line utility from Microsoft .我最终可能会将它托管在一个网站上,作为任何想要安全删除程序的人的免费扩展。
@ECHO OFF
SETLOCAL EnableDelayedExpansion
TITLE Del 2.0
GOTO PRECHECK

:PRECHECK
ECHO Del 2.0
ECHO Checking...
IF NOT EXIST "!CD!\To-Do" (
ECHO To-Do Folder Not Found
ECHO.
ECHO Nothing To Delete
PAUSE >NUL
GOTO END
)
IF NOT EXIST "!CD!\_sdelete.exe" (
ECHO SDelete Program Not Found
ECHO.
ECHO Core File "_sdelete.exe" Missing
PAUSE >NUL
GOTO END
) ELSE (
ATTRIB +S +H "!CD!\_sdelete.exe" >NUL
)
TIMEOUT /T 1 /NOBREAK >NUL
GOTO SETVARS

:SETVARS
CLS
ECHO Del 2.0
ECHO Writing Variables...
SET TAB=
SET FILES_TEMP=0
SET FILES_TOTAL=0
SET FILES_DONE=0
SET FILES_MISSING=0
SET ROOTCD=!CD!
SET HOMECD=!CD!\To-Do
SET DELITE="!CD!\_sdelete.exe"
TIMEOUT /T 1 /NOBREAK >NUL
GOTO START

:START
CLS
ECHO Del 2.0
ECHO Starting...
ATTRIB -S -H ** /S /D
CD To-Do
TIMEOUT /T 1 /NOBREAK >NUL
CLS
ECHO Del 2.0
ECHO Counting Files...
FOR /R %%f IN (**) DO (
CLS
SET /A FILES_TOTAL += 1
ECHO Del 2.0
ECHO Files Found^: !FILES_TOTAL!
)
TIMEOUT /T 1 /NOBREAK >NUL
GOTO ERASEFILES

:ERASEFILES
CLS
ECHO Del 2.0
ECHO Erasing Files...
SETLOCAL DisableDelayedExpansion
FOR /R %%f IN (*.*) DO (
SET "FILES_TEMP=%%f"
CALL :SUBERASE
)
GOTO FINISHERASE

:SUBERASE
CLS
ECHO Del 2.0
ECHO Files Done^: %FILES_DONE% / %FILES_TOTAL%
ECHO Missing^: %FILES_MISSING%
IF EXIST "%FILES_TEMP%" (
%DELITE% -p 13 -q "%FILES_TEMP%" >NUL
SET /A FILES_DONE += 1
) ELSE (
SET /A FILES_MISSING += 1
)
EXIT /B

:FINISHERASE
SETLOCAL EnableDelayedExpansion
CLS
ECHO Del 2.0
ECHO Files Done^: !FILES_DONE! / !FILES_TOTAL!
ECHO Missing^: !FILES_MISSING!
TIMEOUT /T 3 /NOBREAK >NUL
GOTO CLEANUP

:CLEANUP
CLS
ECHO Del 2.0
ECHO Cleaning Up...
IF !FILES_MISSING! EQU 0 (
FOR /D %%f in (*.*) DO (
SETLOCAL DisableDelayedExpansion
SET "FILES_TEMP=%%f"
SETLOCAL EnableDelayedExpansion
RD "!FILES_TEMP!" /S /Q >NUL
)
)
TIMEOUT /T 1 /NOBREAK >NUL
GOTO END

:END
CLS
ECHO Del 2.0
ECHO Complete^^!
TIMEOUT /T 3 /NOBREAK >NUL
EXIT

最佳答案

保留Delayed Expansion使用 call command 禁用如下:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
FOR /R %%f IN (*.*) DO (
SET "FILES_TEMP=%%f"
CALL :doAll
)
goto :skipSubroutine

:doAll
CLS
ECHO Del 2.0
ECHO Files Done^: %FILES_DONE% / %FILES_TOTAL%
ECHO Missing^: %FILES_MISSING%
IF EXIST "%FILES_TEMP%" (
%DELITE% -p 13 -q "%FILES_TEMP%" >NUL
SET /A FILES_DONE += 1
) ELSE (
SET /A FILES_MISSING += 1
)
goto :eof

:skipSubroutine

如果 FILES_TEMP变量需要 Delayed Expansion enabled然后 :doAll子程序可能如下所示(注意 ENDLOCAL 命令被使用两次以在脚本范围内正确更新变量 FILES_DONEFILES_MISSING):
:doAll
CLS
ECHO Del 2.0
ECHO Files Done^: %FILES_DONE% / %FILES_TOTAL%
ECHO Missing^: %FILES_MISSING%
SETLOCAL EnableDelayedExpansion
IF EXIST "!FILES_TEMP!" (
%DELITE% -p 13 -q "!FILES_TEMP!" >NUL
ENDLOCAL
SET /A FILES_DONE += 1
) ELSE (
ENDLOCAL
SET /A FILES_MISSING += 1
)
goto :eof

关于batch-file - 已达到最大 setlocal 递归级别和 endlocal。解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37765877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com