【问题标题】:Windows Batch file to move X number of files from folder to folderWindows批处理文件将X个文件从一个文件夹移动到另一个文件夹
【发布时间】:2012-02-03 04:57:31
【问题描述】:

如果%DataLoc% 中的文件少于 20 个,我正在尝试使用批处理文件以 30 个块为单位移动文件。我从a prior question 修改了代码。问题出在文件的FMove 部分。无论我在for 行中输入什么内容,都会出现错误。

我希望它具有 %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:>

【问题讨论】:

    标签: batch-file


    【解决方案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
    )
    

    【讨论】:

    • 虽然这段代码可以回答问题,但请添加一些解释。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我试过了,但它不起作用。我更新了文本,因为我需要在路径中包含空格,但试图将其简化为最简单的查找错误。我敢肯定这很简单,但我只是看不到它。此更新循环返回的错误: set SrcCount=0 set SrcMax=30 echo %HoldLoc% FOR %%G IN (c:\Data**.tmp) DO IF !SrcCount! LSS %SrcMax% ( SET /A SrcCount += 1 move /Y %G "%DataLoc%" ) 现在是: FOR %F IN (c:\Play\hold*.tmp) DO IF !SrcCount! LSS %SrcMax% (
    • 好的,抱歉。这是代码,确实有帮助,但我仍然缺少一些东西。 FOR /F %%G IN ('DIR /B %HoldLoc%*.tmp') DO IF !SrcCount! LSS %SrcMax% ( SET /A SrcCount += 1 move /y %G %%DataLoc% ) goto Exit 但它没有给出源的路径:C:\Play\Hold>set SrcMax=30 C: \Play\Hold>FOR /F %G IN ('DIR /B C:\play\H old*.tmp') DO IF !SrcCount! LSS 30 ( SET /A SrcCount += 1 move /y C:\play\Data ) 系统找不到指定的文件。 C:\Play\Hold>REM echo !SrcCount! move /y DataLoc" C:\Play\Hold>goto Exit
    • @John: 1) 将%HoldLoc%*.tmp 括在双引号中:FOR /F %%G IN ('DIR /B "%HoldLoc%*.tmp"') DO …。 2)在move命令所在的那一行: 2.1)把%G改成%%G; 2.2) 将%%G 括在双引号中 2.3) 删除%%DataLoc% 开头的额外%; 2.4) 用双引号将%DataLoc% 括起来。生成的命令将是:move /y "%%G" "%DataLoc%".
    • @John:还有 3) 请务必尽可能提出与您的实际问题相关的问题。您在原始帖子中提出的问题似乎过于简化,因为正如我现在所看到的,您必须处理包含空格的路径/名称,而这在您的原始问题中并不明显。如果我一开始就知道这么多,我肯定会建议您立即使用双引号。我的意思是,如果您的所有问题都在原始帖子中而不是在 cmets 中提出,那么对其他人会更有帮助。
    【解决方案3】:

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

      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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多