2012-02-03 117 views
0

帮助如果%DataLoc%中的文件少于20个,则尝试使用代码将文件移动到30个块中。我修改了代码Prior question。问题出在文件的FMove部分。无论我把什么放在线上,都会给我一个错误。 我希望它具有%HoldLoc%值,但是由于出现错误而导致硬编码。Windows批处理文件将文件夹中的X个文件移动到文件夹

环境是Windows 2008 R2服务器。

变化我已经尝试了下面的那些以及括号中的引号和引号。

FOR%F IN(%HoldLoc%) FOR%F IN(%% HOLDLOCK%) FOR%F IN(C:\播放\暂停* .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:> 

>

回答

0

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

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

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

+0

我试过,但它不工作。我更新了文本,因为我需要在路径中包含空格,但试图将其缩小到最简单的位置以查找错误。我相信这是一件简单的事情,但我没有看到它。与此更新环路返回的错误: 组SrcCount = 0 组SrcMax = 30 回波%HoldLoc% FOR %% G IN(C:\数据\ ** TMP)DO IF SrcCount! LSS%SrcMax%( \t SET/A SrcCount + = 1 \t移动/ Y%G “%DataLoc%” \t) 现在是: FOR%F IN(C:\播放\保持\ *。 tmp)DO IF!SrcCount! LSS%SrcMax%( – John 2012-02-03 11:42:47

+0

OK,对不起,这是代码和DID帮助,但我仍然错过了一些东西 FOR/F %% G IN('DIR/B%HoldLoc%\ *。tmp')DO IF!SrcCount!LSS%SrcMax%( \t SET/A SrcCount + = 1 \t移动/ Y%G %% DataLoc% \t) 转到退出 ,但它是不给出的路径的源: C: \ Play \ Ho ld> set SrcMax = 30 C:\ Play \ Ho ld> FOR/F%G IN('DIR/BC:\ play \ H old \ *。tmp')DO IF!SrcCount! LSS 30( SET/A SrcCount + = 1 move/y C:\ play \ D ata ) 系统找不到指定的文件。 C:\ Play \ Ho ld> REM echo!SrcCount!移动/ y DataLoc“ C:\ Play \ Ho ld> goto退出 – John 2012-02-03 11:52:30

+0

@John:1)用''/'%'GIN('DIR/B')将'%HoldLoc%*。 2)在'move'命令所在行:2.1)将'%G'改为'%% G'; 2.2)将'%% G'改为double引号2.3)在'%% DataLoc%'开头删除一个额外的'%'; 2.4)用''DataLoc%''在双引号中括起来,结果命令为:'move/y'%% G“”%DataLoc %“'。 – 2012-02-03 14:51:04

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 
1
@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

虽然此代码可能会回答问题,请添加一些说明。 – pinepain 2014-07-06 20:46:13

相关问题