xsanekk пишет:в папку В нельзя копировать, потому что туда валятся файлы после проверки, и причем в папке Б сама программа очищает каталоги каждый день при "открытии дня"
[..]
Rom5 пишет:И еще вопрос - а все ли файлы после обработки попадают в архив VPS, может программа ведет еще и архив необрабатываемых по какой-то причине, например, из-за "поломки" файла ? - не наступает же программа на одни и те же "грабли", пока смотрящий не выймет файл из Б вручную.
нет архива забракованных нет...
Хмм.. Т.е. обработка всегда - положительная?) А что запускает программу обработки - как-то шедулером? или вручную? или она циклически сама проверяет?..
Предложенная выше мной папка "В" - это не уже существующая у Вас папка VPS:)
Это папка, в которую помещаются имена отправленных на обработку программой файлов.
В Вашем случае особых сравнений в пакетной cmd-файле вести и не надо. Цикл проходит только по файлам указанных Вами масок в наборе команды - FOR переменная IN (маска1;маска2;...) DO команды. А в качестве команд всего лишь проверка наличия файла (его имя уже в переменной) в папке "В" и, если файла в папке нет - копируем на обработку и дублируем файл в папку "В" (либо создаем файл-пустышку как в моем примере).
Вот, код test.cmd (в коде больше комментариев, чем самого кода):
@Echo OFF
::: В данную переменную заносим путь основного копирования (каталог Б, для обработки)
set DEST_B=c:\test_B
::: Заносим путь дублирующего копирования - архив имен файлов за текущий день, для дальнейших проверок при отлавливании дублей.
::: В начале дня этот каталог надо чистить, например, командой: DEL c:\test_DAY\*.7kz
set DEST_ARCNAMES=c:\test_DAY
::: Переходим в каталог А
c:
CD \test_A
:: Вывод списка всех 7kz-файлов - для отладки
Echo --- List folder A :
dir /w /b DEST_ARCNAMES *.7kz & Echo. & Pause & Echo.
::: В FOR в скобках IN перечисляем через ";" свои шаблоны поиска копируемых файлов
:: переменная %%I - полный путь и имя текущего файла
:: переменная %%~nI%%~xI -- только имя с расширением текущего файла
FOR /R %%I IN (a4???200.7kz;j4???200.7kz) DO (
Echo Searching in %DEST_ARCNAMES% file - %%~nI%%~xI ...
IF EXIST %DEST_ARCNAMES%\%%~nI%%~xI (
:: сообщаем о нахождении дубля
Echo -!- This is double. Don't copy.
) ELSE (
:: копируем текущий файла для обработки
<nul set /p strTemp=--step1-- Need copying to %DEST_B%... _
copy %%I %DEST_B%\*.*
:: копируем текущий файла в накопительный каталог
<nul set /p strTemp=--step2-- Duplication in %DEST_ARCNAMES%... _
:::::copy %%I %DEST_ARCNAMES%\*.*
:: или вместо копирования - создаем пустой файл (дешево и сердито, зато время создания файла = времени отправки файла на обработку)
Echo. 2> %DEST_ARCNAMES%\%%~nI%%~xI
)
)
Pause
exit
Для тестирования: создал папки c:\test_А, c:\test_B, c:\test_DAY, в c:\test_А создал несколько файлов с "нужными" и "ненужными" именами, скопировал один из нужных файлов в c:\test_DAY (для теста дубля) и запустил батник на выполнение. Вот, его вывод:
--- List folder A :
A4asd200.7kz
A4qwe200.7kz
B4qwe200.7kz
J4qwe200.7kz
J4qwe201.7kz
Для продолжения нажмите любую клавишу . . .
Searching in c:\test_DAY file - A4asd200.7kz ...
-!- This is double. Don't copy.
Searching in c:\test_DAY file - A4qwe200.7kz ...
--step1-- Need copying to c:\test_B... _Скопировано файлов: 1.
--step2-- Duplication in c:\test_DAY... _Системе не удается найти указанный диск.
Searching in c:\test_DAY file - J4qwe200.7kz ...
--step1-- Need copying to c:\test_B... _Скопировано файлов: 1.
--step2-- Duplication in c:\test_DAY... _Системе не удается найти указанный диск.
Для продолжения нажмите любую клавишу . . .
Сообщение "Системе не удается найти указанный диск." игнорируем, это побочный эффект создания "пустышки".
Т.к. этот батник - это не законченный продукт как предлагаемый Вам выше скрипт, поэтому он подразумевает Ваши ручные действия - очистка утром папки "В" и циклический запуск вручную или планировщиком.
Если его запускать автоматически - нужно закомментарить все паузы, да в принципе и команды вывода сообщений - тоже (либо перенаправлять их в некий файл-протокол), например, так:
код test2.cmd избавленный от пауз и комментариев
@Echo OFF
::: В данную переменную заносим путь основного копирования (каталог Б, для обработки)
set DEST_B=c:\test_B
::: Заносим путь дублирующего копирования - архив имен файлов за текущий день, для дальнейших проверок при отлавливании дублей.
::: В начале дня этот каталог надо чистить, например, командой: DEL c:\test_DAY\*.7kz
set DEST_ARCNAMES=c:\test_DAY
::: Переходим в каталог А
c:
CD \test_A
Echo ----- >> log.txt
time /t >> log.txt
FOR /R %%I IN (a4???200.7kz;j4???200.7kz) DO (
Echo Searching in %DEST_ARCNAMES% file - %%~nI%%~xI ... >> log.txt
IF EXIST %DEST_ARCNAMES%\%%~nI%%~xI (
Echo -!- This is double. Don't copy. >> log.txt
) ELSE (
:: копируем текущий файла для обработки
Echo Copying to %DEST_B%... >> log.txt
copy %%I %DEST_B%\*.* >> log.txt
:: создаем пустой файл с именем текущий файла в накопительном каталоге
Echo Duplication in %DEST_ARCNAMES%... >> log.txt
Echo. 2> %DEST_ARCNAMES%\%%~nI%%~xI
)
)
В каталоге А ведется текст.файл протокола сканирования - log.txt
WBR. Roman