我正在尝试编写一个每15分钟运行一次的批处理脚本,检查目录中的文件数量,如果该数字大于设置限制,则将所有文件移动到另一个目录。我很容易在bash脚本中执行此操作,但这是我的第一个批处理脚本。
我分几步完成这项任务:
查找目录中的文件数。 我设法用这个命令做到了这一点:
dir / b / a-d d:\ test \ test2 | find / v / c“::”
接下来要将此命令的输出分配给某个变量,以便将其与我想要的限制进行比较。这是问题开始的地方。
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会在这种情况下起作用吗?
答案 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\")