Пакетный файл Windows для перемещения количества файлов X из папки в папку - PullRequest
2 голосов
/ 03 февраля 2012

СПРАВКА Попытка использовать код для перемещения файлов по 30 блоков, если в% DataLoc% меньше 20 файлов.Я изменил код с Предыдущий вопрос .Проблема в разделе FMove файла.Независимо от того, что я положил в строку для, это дает мне ошибку.Я хочу, чтобы у него было значение% 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 ]

2 голосов
/ 06 июля 2014
@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
)
0 голосов
/ 07 февраля 2012

Я обновил код и заставил его работать, изменив некоторые вещи.Спасибо Энди за советы, но я не смог заставить их работать с предложениями - я бы не удивился, если бы не следовал им, и это на МОЕЙ стороне, а не на вашей.

  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
0 голосов
/ 03 февраля 2012

Ваш скрипт использует неверный синтаксис для переменной цикла в одном из двух циклов:

FOR <b><i>%F</i></b> IN (c:\Play\hold\*.tmp) DO …

Просто попробуйте изменить %F на %%F. Одиночный знак процента плюс буква - это синтаксис для переменных цикла при запуске циклов непосредственно из командной строки. В пакетных сценариях вы всегда должны использовать двухпроцентные ссылки для переменных цикла, как в цикле FOR /F %%a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...