Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование в папку исходя из вложенных файлов (http://forum.oszone.net/showthread.php?t=240937)

foma24 20-08-2012 11:07 1973200

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

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

megaloman 21-08-2012 19:48 1974156

Цитата:

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

foma24 22-08-2012 09:08 1974463

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 1974564

Код:

@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 1974680

Спасибо, если возможно, поясните пожалуйста строчки

Код:

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 1974867

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

foma24 23-08-2012 09:10 1975185

Огромное Спасибо за разъяснения!!!


Время: 11:17.

Время: 11:17.
© OSzone.net 2001-2025