带管道的Windows 2003批处理脚本

时间:2013-05-07 13:47:40

标签: batch-file cmd

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

我分几步完成这项任务:

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

      

    dir / b / a-d d:\ test \ test2 | find / v / c“::”

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

  3.     ECHO OFF
        setlocal enableextensions
    
        FOR /F "tokens=* USEBACKQ" %%a IN (`dir/b/a-d d:\test\test2 ^| find /v /c "::"`)
        DO (@SET NUMFIL=%%a)
        ECHO %NUMFIL%
    
        endlocal
    

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

第二个问题的秘密在于find关键字必须出现在与do子句的右括号相同的行上。可以将结构分解为

IN

请注意,FOR /F "tokens=* USEBACKQ" %%a IN ( ' dir/b/a-d d:\test\test2 ^| find /v /c ":" ' ) DO (SET NUMFIL=%%a) 不是必需的 - 它会禁止命令@被初始echo关闭(@echo off会抑制回显@

此外,此ECHO OFF周围的括号不是必需的。如果使用它们,则开括号必须出现在与set相同的物理线上。

您也不需要使用do,因为您不需要更改引号的解释。

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

同样,开括号必须与>在同一行。使用if时,else之前的close-parenthsis,ELSE关键字和后面的开括号都必须位于同一物理行上。

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