Batch file 基于剩余空间和最旧文件的清理实用程序
我想为我的RDX创建一个清理工具。 它将测试磁带上的可用空间是否小于某个阈值,并擦除最旧的文件,直到达到该阈值 我用一些代码修补了一些东西,但我不知道出了什么问题:Batch file 基于剩余空间和最旧文件的清理实用程序,batch-file,Batch File,我想为我的RDX创建一个清理工具。 它将测试磁带上的可用空间是否小于某个阈值,并擦除最旧的文件,直到达到该阈值 我用一些代码修补了一些东西,但我不知道出了什么问题: @echo off @setlocal enableextensions @setlocal enabledelayedexpansion for /f "tokens=7" %%a in ('fsutil volume diskfree e:') do set free=%%a for /f "delims=" %%b in
@echo off
@setlocal enableextensions
@setlocal enabledelayedexpansion
for /f "tokens=7" %%a in ('fsutil volume diskfree e:') do set free=%%a
for /f "delims=" %%b in ('"dir e:\*.zip /A-D /OD /B"') do set file=%%b
if %free:~0,-9% lss 61 del e:\%file% else exit
每一行似乎都是单独工作的,但不是循环。
你能帮帮我吗
提前感谢=)试试这个:
@echo off &setlocal enableextensions
for /f "tokens=7" %%a in ('fsutil volume diskfree e:') do set "free=%%a"
for /f "delims=" %%b in ('dir e:\*.zip /A-D /O-D /B') do set "file=%%b"
if %free:~0,-9% lss 61 (del "e:\%file%") else exit
不知道你说的“不是循环”是什么意思-有两个循环,但你说每一行都是分开工作的
在我的机器上工作得很愉快-那么你到底是什么意思
以下几点可能会有所帮助:
@
仅表示“在执行此命令之前不要将其回显到控制台”。执行@echo off
指令后,命令的回显将停止,因此@
是冗余的。在@echo off
命令中需要,因为否则关闭echo的指令本身就是echo
ed
setlocal
都会启动一个新的本地环境,继承所有当前环境变量。使用两个并没有错,它只是多余的<代码>设置本地启用扩展启用延迟扩展就足够了。在此例程中没有使用delayedexpansion
,因此本身就是冗余的。CMD.EXE
的默认状态是enableextensions
。您必须采取显式操作来禁用扩展,大多数批处理程序将采用默认条件
:
加载到免费密码中
dir
命令的双引号是相等的。执行单引号之间的命令。除非要执行的命令中有一个单引号,否则添加双引号不会起任何作用IF
比较可能会出现严重错误。任何%var%
都是在执行指令之前解析的,因此如果free
包含的字符少于9个,%free:~0:-9%
将解析为[nothing],并且如果lss 61…,指令将作为执行,这将是一个语法错误。请注意,在您的情况下,空闲
可能是:
,即使在更正后,如果您的空闲字节少于100000000字节,%free:~0:-9%
将被解析为零并生成错误
dir
命令找不到与您的选择条件匹配的文件,文件将包含启动批处理时所具有的任何值。很可能,变量file
永远不会被设置,但是假设它被设置为myveryimportantfile
?因此,最好确保批处理中使用的所有变量都已初始化
@echo off
setlocal
FOR %%I IN (free file) DO SET "%%I="
for /f "tokens=8" %%a in ('fsutil volume diskfree e:') do set free=%%a
for /f "delims=" %%b in ('dir e:\*.zip /A-D /OD /B') do set file=%%b
IF NOT DEFINED FILE EXIT
SET "FREE=%FREE:~0,-9%"
IF NOT DEFINED FREE SET /A FREE=0
if %FREE% lss 61 del "e:\%file%"
(大小写冗余-大写更改。%%x
的元变量大小写重要)
请注意,严格来说,即使SETLOCAL也是冗余的,但它确实确保了该批处理在终止后不会影响环境的状态
语法设置“var=somethingorevennothing”
非常重要。一个简单的SET
语句是针对字符串的,所以空格很重要。如果空格出现在=
之前,则它将包含在所设置的变量名中。如果行的末尾有空格,也会包含空格。引用集合克服了第二个问题。警惕战胜了第一个
SET/A
忽略这些空格,但只能用于设置数值。这些数值实际上存储为字符串
HTH除了彼得的所有评论之外,你的问题并没有在第二个星期循环 阅读
的帮助,然后您可以尝试以下内容
for /f "delims=" %%b in ('"dir e:\*.zip /A-D /OD /B"') do (
set file=%%b
if %free:~0,-9% lss 61 del e:\%file%
)
但是,等等,还有更多问题:%free%在删除后没有刷新;比较可能不正确;变量%file%未在每次循环迭代时更新。。。这些可能是其他SO问题的主题。在我的机器上,自由空间是第五个标记:)就我个人而言,我更喜欢tokens=2delims=:
,它应该独立于语言,但离开free
时有一个容易克服的前导空间。