2013-05-07 4 views
2

Я пытаюсь написать пакетный скрипт, который будет запускаться каждые 15 минут, проверять количество файлов в каталоге и, если это число больше, чем установить ограничение, переместите все файлы в другой каталог. Я бы легко сделал это в скрипте bash, но это мой первый пакетный скрипт.Пакетный сценарий Windows 2003 с трубой

Я разделил эту задачу в несколько этапов:

  1. Находим количество файлов в каталоге. Мне удалось сделать это с помощью этой команды:

    dir/b/a-d d: \ test \ test2 | find/v/c "::"

  2. Следующая вещь - назначить вывод этой команды некоторой переменной, чтобы я мог сравнить ее с моим желаемым пределом. Здесь начинается проблема.

 
    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 2003.

3.После получения эта проблема решена, я планирую вставить что-то вроде этого:

IF %%NUMFIL%% > 20 
(move "d:\test\test2\ti*" "d:\test\test2\dir\") 

Это было бы переместить все, что файлы (все они начинаются с «ти») к желаемый каталог.

Так что мои вопросы были бы следующими: что делать с проблемой №2 и будет работать в этом случае?

+0

'FOR' и' DO' должны находиться на одной линии. – indiv

+0

# 3: Удивительно, что синтаксис сравнения объясняется на 'IF /?' – jeb

+0

Спасибо indiv, положив его на ту же линию. – Vald

ответ

2

Не уверен ":: будет работать в вашем первом случае, так как :: вряд ли появится на выходе DIR. Одного двоеточия было бы достаточно, так как опция /cfind подсчитывает количество ЛИНИЙ, в которых происходит целевая строка.

Секрет второй проблемы заключается в том, что ключевое слово 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, близким партентисом до ELSE, ключевое слово ELSE и открытая скобка после должны все быть на одной физической линии.

+0

Спасибо, что решила проблему. «::» работал так же, как «:». – Vald

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\") 
Смежные вопросы