Войти

Показать полную графическую версию : [решено] Копирование в папку исходя из вложенных файлов


foma24
20-08-2012, 11:07
Добрый день. Есть файлы для отправки BV100_ZNOXXXXXXXX_XXXXXXXXXXXX_NNNNNN.txt , где X - постоянные не меняющиеся числа, а N - меняется. Данные файлы хранятся в папках вида YYYY-MM-DD. На эти файлы приходят ответные файлы вида
KWTFCB_BV100_ZNOXXXXXXXX_XXXXXXXXXXXX_NNNNNN.txt Дата в наименовании папки не текущая.

Нужно чтобы ответный файл кидался в папку, где лежит файл для отправки. Подскажите как это можно реализовать.

megaloman
21-08-2012, 19:48
На эти файлы приходят ответные файлы вида - Изначально в какую папку (папки?) - в какую-то одну? Или тоже по датам? Или файлы приходят в те же папки, что и отправленные но не в нужную дату?

foma24
22-08-2012, 09:08
BV100_ZNOXXXXXXXX_XXXXXXXXXXXX_NNNNNN.txt лежит в папке YYYY-MM-DD

KWTFCB_BV100_ZNOXXXXXXXX_XXXXXXXXXXXX_NNNNNN.txt приходит в папку temp, и его нужно переместить в YYYY-MM-DD

YYYY-MM-DD не текущая дата

megaloman
22-08-2012, 11:48
@Echo Off

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

Set In=E:\Delete\TMP
Set Out=E:\Delete\Out

Set PIn=KWTFCB_
Set POut=BV100_ZNO

FOR /F "usebackq delims=" %%i IN (`Dir "%In%\%PIn%%POut%*.txt" /b /A:-D`) DO (
Set x=%%i
Set x=!x:%PIn%=!
FOR /F "usebackq delims=" %%j IN (`Dir "%Out%\!x!" /b /s /A:-D`) DO Move "%In%\%%i" "%%~dpj"
) Проследите, чтобы при определении путей и префиксов в батнике в конце строки не было пробелов
В соответствии с постановкой задачи в папке E:\Delete\Out хранятся подпапки с датами, в которых имеются отправленные файлы (я предполагаю, что иных папок там нет, иначе батник будет дольше работать), а в папку E:\Delete\TMP приходят ответные файлы. Желательно, чтобы Tmp не была внутри Out

foma24
22-08-2012, 15:07
Спасибо, если возможно, поясните пожалуйста строчки


Set x=%%i
Set x=!x:%PIn%=!
FOR /F "usebackq delims=" %%j IN (`Dir "%Out%\!x!" /b /s /A:-D`) DO Move "%In%\%%i" "%%~dpj"
)

особо интересуют
Set x=!x:%PIn%=!
!x!
~dpj

и что означают восклицательные знаки ?

megaloman
22-08-2012, 18:53
Как это работает.
Dir "%In%\%PIn%%POut%*.txt - выдаёт список файлов по указанной маске в инбоксе. В конкретном случае здесь
E:\Delete\TMP\KWTFCB_BV100_ZNO*.txt
(смотрите подсказку по команде Dir /? )
Для того, чтобы направить результаты вывода команды Dir в переменную %%i использую For (смотрите подсказку по команде For /? )
Переменной x присваиваю имя файла, выданное командой Dir из инбокса. Переменные, заключенные в !…! вместо %…%, будут раскрыты в их значения только в момент непосредственного использования. Режим включается командой
setlocal enabledelayedexpansion (Почитайте здесь) (http://www.rsdn.ru/article/winshell/batanyca.xml)
Ушедшие из аутбокса файлы отличаются по имени от пришедших только отсутствием префикса (у Вас это KWTFCB_)
Командой Set x=!x:%PIn%=! я в имени пришедшего файла удаляю этот префикс (точнее, заменяю строку префикса на пустую строку (смотрите подсказку по команде Set /? ), этим самым я получаю имя ушедшего файла.
Далее командой Dir в аутбоксе E:\Delete\Out во всех поддиректориях ( /s ) ищу полное имя отправленного файла ( /b ), причём при поиске имена директорий не рассматриваю ( /A:-D - по видимому, здесь это лишнее).
Если файл найден, перемещаю (Move) пришедший файл в папку с отправленным (%%~dpj из полного имени отправленного файла %%j выделяет диск и путь)(смотрите подсказку по команде For /? )

foma24
23-08-2012, 09:10
Огромное Спасибо за разъяснения!!!




© OSzone.net 2001-2012