Windows批处理文件,用于将X个文件从文件夹移动到文件夹

时间:2012-02-03 04:57:32

标签: batch-file

帮助如果%DataLoc%中的文件少于20个,请尝试使用代码以30个为单位移动文件。我修改了Prior question的代码。问题出在文件的FMove部分。无论我放入for line,它都会给我一个错误。 我希望它具有%HoldLoc%值,但由于我得到的错误而一直在对它进行硬编码。

环境是Windows 2008 R2服务器。

变化我尝试过下面的内容以及括号中有和没有引号。

FOR%F IN(%HoldLoc%) FOR%F IN(%% HoldLock%) FOR%F IN(c:\ Play \ hold * .tmp)

我的代码:

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

echo on
set DataMax=20
set DataLoc=C:\Play\Data
Set HoldLoc=C:\Play\Hold
set count=0
FOR /F %%a in ('DIR /B %DataLoc%\*.tmp') do set /A count=count+1
if %count% GEQ %DataMax% (Goto Exit) else (GOTO FMove)
:FMove
Echo Gather Top 30 files
set SrcCount=0
set SrcMax=30
echo %HoldLoc%
FOR %F IN (c:\Play\hold\*.tmp) DO IF !SrcCount! LSS %SrcMax% (
    SET /A SrcCount += 1
    move /y %F  "%DataLoc%"
    )

问题是我在输出窗口中看到了这个,为什么看不到C?

C:>set /A count=count+1

C:>if 19 GEQ 20 (Goto Exit )  else (GOTO FMove )

C:>Echo Gather Top 30 files
Gather Top 30 files

C:>set SrcCount=0

C:>set SrcMax=30

C:>echo C:\Play\Hold
C:\Play\Hold
\Play\hold\*.tmp) was unexpected at this time.

C:>FOR \Play\hold\*.tmp) DO IF !SrcCount! LSS 30 (

C:>

>

3 个答案:

答案 0 :(得分:2)

@echo off

set Source=C:\perl\Drift_Bat\IN
set Target=C:\perl\Drift_Bat\OUT

set MaxLimit=20

for /f "tokens=1* delims=[]" %%G in ('dir /A-D /B "%Source%\*.*" ^| find /v /n ""') do (
    move /y "%Source%\%%~nxH" "%Target%"
    if %%G==%MaxLimit% exit /b 0
)

答案 1 :(得分:0)

您的脚本在两个循环之一中使用不正确的循环变量语法:

FOR %F IN (c:\Play\hold\*.tmp) DO …

尝试将%F更改为%%F。单个百分号加上字母是直接从命令提示符运行循环时循环变量的语法。在批处理脚本中,您应该始终对循环变量使用双百分比引用,就像在FOR /F %%a循环中一样。

答案 2 :(得分:0)

我更新了代码并通过更改某些内容使其工作。感谢Andy提供的建议,但我无法让它与建议一起工作 - 如果我不遵循它们,我不会感到惊讶,这是我的一面,而不是你的。

  FOR /F %%G IN ('DIR /B "%HoldLoc%"\*.tmp') DO IF !SrcCount! LSS %SrcMax% (
   SET /A SrcCount += 1 
   Echo "%HoldLoc%"
   Echo "%%G%"
   Echo "%SrcCount%
   move /y "%HoldLoc%"\"%%G" "%DataLoc%"

这是我最终得到的 - 更长但仍然有效:

SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION

echo on
set DataMax=50
set DataLoc=C:\Test Data (x86)
Set HoldLoc=C:\Test Hold
set count=0
FOR /F %%a in ('DIR /B "%DataLoc%"\*.tmp') do set /A count=count+1
if %count% GEQ %DataMax% (Goto Exit) else (GOTO FMove)
:FMove
Echo Gather Top 30 files
set SrcCount=0
set SrcMax=30
FOR /F "TOKENS=*" %%a IN ('dir /A-D /O-D /B "%HoldLoc%"\*.tmp') DO (
        SET /A SrcCount += 1
        if !SrcCount! LEQ %SrcMax% (
        MOVE /y "%HoldLoc%\%%a" "%DataLoc%"
        )
    )
goto Exit
:Exit
close