2

我正在尝试编写一个每 15 分钟运行一次的批处理脚本,检查目录中的文件数量,如果该数量大于设置限制,则将所有文件移动到另一个目录。我很容易在 bash 脚本中执行此操作,但这是我的第一个批处理脚本。

我将此任务分为几个步骤:

  1. 查找目录中的文件数。我设法用这个命令做到了这一点:

    目录/b/ad d:\test\test2 | 查找 /v /c "::"

  2. 接下来是将此命令的输出分配给某个变量,以便我可以将它与我想要的限制进行比较。这就是问题开始的地方。

    回声关闭
    设置本地启用扩展

    FOR /F "tokens=* USEBACKQ" %%a IN (`dir/b/ad d:\test\test2 ^| find /v /c "::"`)
    做(@SET NUMFIL=%%a)
    回声 %NUMFIL%

    本地端

我得到:“|此时出乎意料”。显然,管道正在阻碍。我发现它是特殊字符,因此必须用插入符号转义。这样做之后,我得到:“命令的语法不正确。” 这是 Windows 服务器 2003。

3.解决这个问题后,我打算插入这样的东西:

IF %%NUMFIL%% > 20
(move "d:\test\test2\ti*" "d:\test\test2\dir\")

这会将所有文件(所有文件都以“ti”开头)移动到所需的目录。

所以我的问题是:如何处理#2 问题,#3 在这种情况下会起作用吗?

4

2 回答 2

3

不确定"::在您的第一种情况下是否有效,因为::不太可能出现在 DIR 输出中。一个冒号就足够了,因为/c选项会find计算目标字符串出现的行数。

第二个问题的秘诀是关键字必须与子句do的右括号出现在同一行。IN可以将结构分解为

FOR /F "tokens=* USEBACKQ" %%a IN (
 ' dir/b/a-d d:\test\test2 ^| find /v /c ":" '
) DO (SET NUMFIL=%%a)

请注意,这@不是必需的 - 它抑制了命令的echoed,它被初始关闭@echo off@那里抑制了ECHO OFF

此外,它周围的括号set不是必需的。如果使用它们,则左括号必须与do.

您也不需要使用usebackq,因为您无需在此处更改引号的解释。

第三项 ->是一个重定向器。对于比较运算符,根据需要的比较,使用 EQU GEQ LSS LEQ GTR NEQ 之一。

同样,左括号必须与if. 对于 an else, 、 ELSE 关键字之前的右ELSE括号和之后的左括号必须都在同一物理行上。

于 2013-05-07T14:17:50.313 回答
0

我认为这应该有效。请注意,它不使用反引号。

ECHO OFF
setlocal enableextensions
FOR /F %%a IN (' dir /b /a-d "d:\test\test2" ^| find /c /v "" ') DO SET NUMFIL=%%a
ECHO %NUMFIL%
IF %NUMFIL% GTR 20 (move "d:\test\test2\ti*" "d:\test\test2\dir\")
于 2013-05-08T09:20:10.503 回答