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

问题描述 投票:1回答:3

我想出了以下代码,该代码开始最小化,等待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

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

batch-file minimize temp
3个回答
0
投票
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


0
投票
问题是第一行没有以选项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传递给子例程Clear_Folder pushd成功地将其作为处理批处理文件的命令过程的当前目录。

另请参见:Where does GOTO :EOF return to?

0
投票
最小化脚本最后没有关闭的原因是您直接启动了脚本,而不是使用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
© www.soinside.com 2019 - 2024. All rights reserved.