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

时间:2019-10-08 08:45:03

标签: batch-file minimize temp

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

我尝试使用exit命令,但由于goto:EOF阻止了它的执行,所以它具有0的作用,但是如果我删除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

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

3 个答案:

答案 0 :(得分:1)

最小化脚本最后没有关闭的原因是您直接启动了脚本,而不是使用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

答案 1 :(得分: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

答案 2 :(得分: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足以删除所有子文件夹和目录中的文件,该文件的路径通过参数1传递给子例程{ {1}},如果该目录确实存在,并且Clear_Folder成功将其设为处理批处理文件的命令进程的当前目录。

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

在执行第一个pushd之后会发生什么,取决于该批处理文件的启动方式以及在哪个环境中运行。

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

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

第一个goto :EOF可以由命令goto :EOF代替,以始终退出,而无需依赖于exit最初如何处理批处理文件的启动和独立执行在调用层次上。因此,在从另一个批处理文件(例如执行更多硬盘清理操作)调用此批处理文件的情况下,建议不要使用cmd.exe