我想制作删除临时文件的 .bat 文件(最小化启动并自动关闭)

I want to make .bat file which deletes temps (starts minimized and closes automatically)

我想出了以下代码,它开始最小化,等待 5 秒(对于慢速 PC)删除临时文件后应该自动关闭,但由于某种原因,自动关闭不起作用,.bat 文件保持最小化.

我尝试使用 exit 命令,但效果为 0,因为 goto :EOF 阻止它执行,但如果我删除 goto :EOF 脚本,则不会删除临时文件

if not DEFINED IS_MINIMIZED set IS_MINIMIZED=1 && start "" /min "%~dpnx0" %* && exit
PING localhost -n 5 >NUL
@echo off
setlocal
call :Clear_Folder %SystemRoot%\TEMP
pushd C:\Users
for /d %%k in (*) do if exist "%%k\AppData\Local\Temp" call :Clear_Folder "%%k\AppData\Local\Temp"
popd
endlocal
goto :EOF
:Clear_Folder
pushd "%~1"
for /d %%i in (*) do rd /s /q "%%i"
del /f /q *
popd
goto :EOF
exit

我期待修复最后一步自动关闭,所有其他功能正常工作,脚本开始最小化,它删除临时文件但在所有这些之后它不会自行关闭并保持最小化。

goto eof 语句明确地转到文件末尾,跳过任何其他内容,包括您的 exit 语句。因此,您需要更改或删除它,在这种情况下,我向 goto 添加了一个不同的标签,标签中只有 exit。第二个循环不需要 goto 因为它会通过标签而不管:

if not DEFINED IS_MINIMIZED set IS_MINIMIZED=1 && start "" /min "%~dpnx0" %* && exit
timeout 5>nul
@echo off
setlocal
call :Clear_Folder %SystemRoot%\TEMP
pushd C:\Users
for /d %%k in (*) do if exist "%%k\AppData\Local\Temp" call :Clear_Folder "%%k\AppData\Local\Temp"
popd
endlocal
exit
:Clear_Folder
pushd "%~1"
for /d %%i in (*) do rd /s /q "%%i"
del /f /q *
popd

解释一下:goto :eof是一个预定义的标签,会退出当前的脚本或子程序。因此它将跳过脚本中的任何内容并停止执行任何进一步的指令。

this link on ss64

问题是第一行没有明确地以选项 /C 开始 cmd.exe 以最小化 window.[=30= 的单独命令进程再次执行批处理文件]

@echo off
if defined IS_MINIMIZED goto ClearFolders
set "IS_MINIMIZED=1"
start "Clear Folders" /min %ComSpec% /C "%~f0" %*
goto :EOF

:ClearFolders
call :Clear_Folder "%SystemRoot%\TEMP"
if defined TEMP call :Clear_Folder "%TEMP%"
for /D %%k in (C:\Users\*) do if exist "%%k\AppData\Local\Temp" call :Clear_Folder "%%k\AppData\Local\Temp"
goto :EOF

:Clear_Folder
pushd "%~1"
if errorlevel 1 goto :EOF
rd /Q /S "%~1" 2>nul
popd
goto :EOF

另请参阅我在 How to delete files/subfolders in a specific directory at the command prompt in Windows? 上的回答 它解释了为什么 rd /Q /S "%~1" 2>nul 足以删除 所有 目录中的子文件夹和文件,其路径通过参数传递1 到子例程 Clear_Folder 如果该目录确实存在并且 pushd 成功使其成为处理批处理文件的命令进程的当前目录。

另请参阅:

执行第一个 goto :EOF 后发生的情况取决于此批处理文件的启动方式和环境。

双击批处理文件会启动 Windows 命令处理器 cmd.exe 以使用隐式选项 /C 来处理批处理文件 close批处理文件执行后的命令过程。在这种情况下,第一个 goto :EOF 导致关闭最初打开的控制台 window,因为处理批处理文件的 Windows 命令进程最初也会关闭。

首先打开 command prompt window 会导致使用隐式选项 /K 启动 cmd.exekeep 命令进程 运行 像执行这个批处理文件一样执行命令行后。在这种情况下,控制台 window 在执行第一个 goto :EOF 后保持打开状态,因为命令进程保持 运行 以供用户进一步执行命令。

第一个 goto :EOF 可以替换为命令 exit 以始终 退出 命令进程独立于 cmd.exe 最初处理批处理的方式文件已启动并独立于调用层次结构。因此,如果此批处理文件是从另一个执行更多硬盘清理操作的批处理文件调用的,则不建议使用 exit

您的最小化脚本没有在最后关闭的原因是您直接启动了脚本,而不是使用它的 /C 选项作为 cmd.exe 的参数。当您直接通过 Start 运行 您的脚本时,cmd.exe 是 运行 使用 /K 选项并将您的批处理文件作为其参数。当使用 /K 选项时,如 运行ning cmd /? 中所述,window 在命令完成后保持打开状态。要关闭 window,您需要显式 exit cmd.exe 实例:

这是我对你打算做什么的看法:

@If Not Defined IS_MINIMIZED Set "IS_MINIMIZED=1"&Start "" /Min "%~f0"&Exit
@Echo Off
Timeout 5 /NoBreak>NUL
Call :Clear_Folder "%SystemRoot%\TEMP"
For /D %%k In ("C:\Users\*")Do If Exist "%%k\AppData\Local\Temp\" Call :Clear_Folder "%%k\AppData\Local\Temp"
Exit
:Clear_Folder
PushD "%~1" 2>NUL||Exit /B
RD /S /Q "%~1" 2>NUL
PopD
GoTo :EOF

如果下面没有其他内容,您也可以删除GoTo :EOF