我想出了以下代码,该代码开始最小化,等待5秒钟(对于慢速PC),然后删除临时文件,应自动关闭,但由于某些原因,自动关闭不起作用,.bat文件保持最小化。
我尝试使用退出命令,但是它具有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
是预定义的标签,它将退出当前脚本或子例程。因此,它将跳过脚本中的所有内容,而只是停止执行任何进一步的指令。
cmd.exe
显式启动/C
来通过最小化窗口的单独命令进程再次执行批处理文件。@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
足以删除目录中的all子文件夹和文件,如果该目录确实存在,该子文件夹和文件将通过参数1传递给子例程
另请参见:Where does GOTO :EOF return to?Clear_Folder
pushd
成功地将其作为处理批处理文件的命令过程的当前目录。
cmd.exe
选项作为/C
的参数。当您直接通过Start
运行脚本时,将使用cmd.exe
选项并以批处理文件作为参数来运行/K
。当使用/K
选项时,如运行cmd /?
所述,命令和窗口在完成后仍保持打开状态。要关闭该窗口,您需要显式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