0

我想为我的 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 ('"dir e:\*.zip /A-D /OD /B"') do set file=%%b
if %free:~0,-9% lss 61 del e:\%file% else exit

每条线似乎都单独工作,但不是循环。你能帮我么?

提前感谢=)

4

3 回答 3

0

尝试这个:

@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
于 2013-04-03T14:32:03.853 回答
0

除了彼得的所有评论之外,您的问题不是在第二个 FOR 循环

阅读HELP FOR然后你会尝试这样的事情......

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 问题的主题。

于 2013-04-03T17:06:24.130 回答
0

不知道你所说的“不是循环”是什么意思——有两个循环,但你说每行单独工作?

在我的机器上工作得非常愉快——那你到底是什么意思?

一些可能有帮助的事情:

  1. 前导@仅表示“在执行之前不要将此命令回显到控制台”。一旦@echo off执行了一条指令,命令的回显就会停止,因此@是多余的。它is需要@echo off命令,因为否则关闭回显的指令本身就会被ECHO编辑。
  2. 每个都setlocal启动一个新的本地环境,继承所有当前的环境变量。使用两个并没有错,它只是多余的。setlocal enableextensions enabledelayedexpansion就足够了。你没有delayedexpansion在这个例程中使用,所以that它本身就是多余的。的默认状态CMD.EXEenableextensions。您必须对扩展采取明确的措施DISABLE- 大多数批处理程序将假定默认条件。
  3. 在我的机器上,可用空间是线上的第 8 个标记,而不是第 7 个。如果您的相同,:这将加载。free
  4. 命令周围的双引号dir是多余的。执行单引号之间的命令。添加双引号没有任何作用,除非在要执行的命令中有单引号。
  5. 可悲的是,IF比较可能会出错。Any%var%在指令执行之前被解析,因此应该free包含少于 9 个字符,%free:~0:-9%将被解析为 [nothing] 并且指令将被执行,因为if lss 61...这将是一个语法错误。请注意,在您的情况下,free甚至:在更正之后,您的可用字节数可能少于 1000000000,%free:~0:-9%将被解析为空并生成错误。
  6. dir如果该命令没有找到与您的选择标准匹配的文件,file则将包含启动批处理时的任何值。很可能,该变量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%"

(案例是多余的 - CAPS 的变化。元变量 FOR 的案例%%x很重要)

请注意,严格来说,即使 SETLOCAL 也是多余的,但它确实确保了该批处理在终止后不会影响环境的状态。

语法SET "var=somethingorevennothing"很重要。一个简单的SET语句是针对 STRINGS 的,所以 SPACES 很重要。如果在 the 之前出现空格,=则它包含在正在设置的变量名中。如果行尾有空格,也包括在内。引用 SET 解决了第二个问题。警惕战胜了第一个。

SET /A忽略这些空格,但只能用于设置 NUMERIC 值。数值实际上存储为字符串。

高温高压

于 2013-04-03T15:09:40.927 回答