我想出了以下代码,该代码开始最小化,等待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
我期待着修复最后一步的自动关闭,所有其他功能都可以正常工作,脚本开始最小化,它删除临时文件,但是在所有这些之后,它不会自行关闭,并且保持最小化。
答案 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
是一个预定义的标签,它将退出当前脚本或子例程。因此,它将跳过脚本中的任何内容,而只是停止执行任何进一步的指令。
答案 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
。