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



我想出了以下代码,它开始最小化,等待 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 "%%kAppDataLocalTemp" call :Clear_Folder "%%kAppDataLocalTemp"
popd
endlocal
goto :EOF
:Clear_Folder
pushd "%~1"
for /d %%i in (*) do rd /s /q "%%i"
del /f /q *
popd
goto :EOF
exit

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

最小化脚本最后没有关闭的原因是您直接启动了脚本,而不是作为参数来cmd.exe它的/C选项。当您直接通过Start运行脚本时,cmd.exe使用/K选项运行,并将批处理文件作为其参数。使用/K选项时,如运行cmd /?中所述,该窗口在命令完成后保持打开状态。要关闭该窗口,您需要显式exitcmd.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 "%%kAppDataLocalTemp" Call :Clear_Folder "%%kAppDataLocalTemp"
Exit
:Clear_Folder
PushD "%~1" 2>NUL||Exit /B
RD /S /Q "%~1" 2>NUL
PopD
GoTo :EOF

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

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 "%%kAppDataLocalTemp" call :Clear_Folder "%%kAppDataLocalTemp"
popd
endlocal
exit
:Clear_Folder
pushd "%~1"
for /d %%i in (*) do rd /s /q "%%i"
del /f /q *
popd

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

请参阅ss64上的此链接

问题是第一行没有明确地以选项/C开头cmd.exe,以使用具有最小化窗口的单独命令进程再次执行批处理文件。

@echo off
if defined IS_MINIMIZED goto ClearFolders
set "IS_MINIMIZED=1"
start "Clear Folders" /min %ComSpec% /C "%~f0" %*
exit /B
:ClearFolders
call :Clear_Folder "%SystemRoot%TEMP"
if defined TEMP call :Clear_Folder "%TEMP%"
for /D %%k in (C:Users*) do if exist "%%kAppDataLocalTemp" call :Clear_Folder "%%kAppDataLocalTemp"
exit /B
:Clear_Folder
pushd "%~1"
if errorlevel 1 goto :EOF
rd /Q /S "%~1" 2>nul
popd
goto :EOF

另请参阅我的答案 如何在 Windows 中的命令提示符下删除特定目录中的文件/子文件夹?它解释了为什么rd /Q /S "%~1" 2>nul足以删除路径与参数 1 一起传递给子例程的目录中的所有子文件夹和文件,Clear_Folder如果该目录确实存在并且pushd成功地使其成为处理批处理文件的命令进程的当前目录。

另请参阅: GOTO :EOF 返回何处?

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

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

首先打开命令提示符窗口会导致使用隐式选项/K启动cmd.exe,以在执行命令行(如执行此批处理文件(后保持命令进程运行。在这种情况下,控制台窗口在执行第一个exit /B后保持打开状态,因为命令进程会继续运行以供用户进一步执行命令。

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

最新更新