Показать полную графическую версию : [решено] Копирование в папку исходя из вложенных файлов
Добрый день. Есть файлы для отправки BV100_ZNOXXXXXXXX_XXXXXXXXXXXX_NNNNNN.txt , где X - постоянные не меняющиеся числа, а N - меняется. Данные файлы хранятся в папках вида YYYY-MM-DD. На эти файлы приходят ответные файлы вида
KWTFCB_BV100_ZNOXXXXXXXX_XXXXXXXXXXXX_NNNNNN.txt Дата в наименовании папки не текущая.
Нужно чтобы ответный файл кидался в папку, где лежит файл для отправки. Подскажите как это можно реализовать.
megaloman
21-08-2012, 19:48
На эти файлы приходят ответные файлы вида - Изначально в какую папку (папки?) - в какую-то одну? Или тоже по датам? Или файлы приходят в те же папки, что и отправленные но не в нужную дату?
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
Спасибо, если возможно, поясните пожалуйста строчки
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 /? )
Огромное Спасибо за разъяснения!!!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.