Как я могу проверить, существует ли каталог с подстановочными знаками внутри if if и скопировать эту папку в другое место? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь написать скрипт для лучшей организации файлов моих клиентов. Я создал две папки . Первый из них называется «папки» и содержит папки для каждого клиента со своими файлами. Имя папки каждого клиента имеет структуру name_surname_uniqueclientid. Второй называется "Raw" и содержит необработанные клиентские файлы и папки, но каждая папка или файл содержит внутри своего имени уникальный идентификатор клиента. Моя цель - извлечь каждый идентификатор из каждой папки "folder" и проверить, есть ли какие-либо файлы или папки внутри папки "Raw" , содержащей этот идентификатор. Если они есть, они должны xcopy в соответствующей папке "folder" с тем же идентификатором.
Моя проблема заключается в том, что я не могу проверить папки, содержащие идентификатор, и переместить их в соответствующую папку «папки»

Мне удалось извлечь идентификатор из имени папки, проверить наличие файлов внутри «Raw» папки, содержащей этот идентификатор, и xcopy их в соответствующие «папки» папка. Насколько я могу сказать, сценарий не входит в последний, если. Он должен найти папки, содержащие идентификатор, и, если они есть, скопировать их в соответствующую папку «folder».

    @echo off

    setlocal enabledelayedexpansion
    for /d %%a in ("folders\*") do (
        for /f "tokens=3 delims=_" %%t in ("%%~nxa") do ( 
        if exist "Raw\*%%t*" (
            xcopy "Raw\*%%t*" "%%a"
            )

Эта часть ниже не работает:

        if exist Raw\*%%t*\ (
            xcopy "Raw\*%%t*\*" "%%a" /s /i
            echo ok
            )
        )
    )
    pause   
    goto :eof

Исходное дерево папок

C:\DATA
├───folders
│   ├───FirstName_Lastname_10123
│   │   |
│   │   │   kjhda10123.rtf
│   │   │   dadsada10123lhlhfds.txt
│   │   │
│   │   └───kjhfdsfs10123f
│   ├───FirstName_Lastname_10124
│   │   │   jgkjgjfs10124kjlda.rtf
│   │   │   klhlidkas10124klhdas.txt
│   │   │
│   │   └───lkhjlkhdsakda10124
│   └───FirstName_Lastname_10125
│       │   kjhkdsa10125.rtf
│       │   10125dakjh.txt
│       │
│       └───10125
|           |   kjhkjda.txt
|           |   hkda.pdf  
└───Raw
    |   dsakhkhda10123.txt
    |   kgjddjasg10125.pdf
    |   kkkkdajh10123khda.docx
    |   10124dsadas
    |   
    └───vcb10125

* После 1034 *

C:\DATA
├───folders
│   ├───FirstName_Lastname_10123
│   │   |   kkkkdajh10123khda.docx
│   │   │   kjhda10123.rtf
│   │   │   dadsada10123lhlhfds.txt
|   |   |   dsakhkhda10123.txt
│   │   │
│   │   └───kjhfdsfs10123f
│   ├───FirstName_Lastname_10124
│   │   │   jgkjgjfs10124kjlda.rtf
│   │   │   klhlidkas10124klhdas.txt
│   │   │   10124dsadas
│   │   └───lkhjlkhdsakda10124
│   └───FirstName_Lastname_10125
│       │   kjhkdsa10125.rtf
│       │   10125dakjh.txt
│       │   kgjddjasg10125.pdf
|       |   vcb10125
│       └───10125
|           |   kjhkjda.txt
|           |   hkda.pdf  
└───Raw
    |   
    |   
    |   
    |   
    |   
    └───

Если папка уже существует, объединить

Ответы [ 2 ]

0 голосов
/ 10 января 2019

ИМО, твой подход не так уж и плох,
но вместо if вам понадобится еще один for для перебора / анализа файлов / папок, найденных в RAW.

Я также move файлы, а не копировать:

:: Q:\Test\2019\01\10\SO_54120642.cmd
@echo off
Set "Base=C:\Data\folders"
Set "Src=C:\Data\Raw"

for /d %%A in ("%Base%\*") do (
    for /f "tokens=3 delims=_" %%T in ("%%~nxA") do (
        for /f "delims=" %%F in ('dir /B /A "%Src%\*%%T*" 2^>Nul') Do ( 
            Move "%Src%\%%F" "%%A\"
        )
    )
)
pause   
goto :eof

С твоим деревом, эмулированным на моем ramdrive, это закончилось:

> tree /F
└───DATA
    ├───folders
    │   ├───FirstName_Lastname_10123
    │   │   │   dadsada10123lhlhfds.txt
    │   │   │   dsakhkhda10123.txt
    │   │   │   kjhda10123.rtf
    │   │   │   kkkkdajh10123khda.docx
    │   │   │
    │   │   └───kjhfdsfs10123f
    │   ├───FirstName_Lastname_10124
    │   │   │   10124dsadas
    │   │   │   jgkjgjfs10124kjlda.rtf
    │   │   │   klhlidkas10124klhdas.txt
    │   │   │
    │   │   └───lkhjlkhdsakda10124
    │   └───FirstName_Lastname_10125
    │       │   10125dakjh.txt
    │       │   hkda.pdf
    │       │   kgjddjasg10125.pdf
    │       │   kjhkdsa10125.rtf
    │       │   kjhkjda.txt
    │       │
    │       ├───10125
    │       └───vcb10125
    └───Raw
0 голосов
/ 10 января 2019

Вопрос? (я знаю, что за это проголосуют, но я хочу помочь ОП и попытаться ясно понять проблему)

  1. Итак, чтобы прояснить это, у вас есть две основные директории под названием folders & Raw правильно?

  2. Внутри folders содержится каждая папка клиента, названная в вашем name_surname_uniqueclientid правильный формат?

  3. Внутри Raw у вас есть «сырые файлы и папки клиента», НО каждый с форматом имени name_surname_uniqueclientid правильный?

  4. Предполагаемое действительное имя папки следует после _uniqueclientid в примере _10123_taxing.rtf ...?

Дерево папок?

C:\DATA
├───folders
│   ├───FirstName_Lastname_10123
│   ├───FirstName_Lastname_10124
│   └───FirstName_Lastname_10125
└───Raw
    │   FirstName_Lastname_10123_taxing.rtf
    │   FirstName_Lastname_10123_text.txt
    │   FirstName_Lastname_10124_data.rtf
    │   FirstName_Lastname_10124_text.txt
    │   FirstName_Lastname_10125.rtf
    │   FirstName_Lastname_10125_text.txt
    │
    ├───FirstName_Lastname_10123_taxing
    ├───FirstName_Lastname_10124_numbers
    └───FirstName_Lastname_10125_names

Цель

Так что, если какие-либо файлы в папке Raw содержат uniqueclientid в имени, вы хотите скопировать их в name_surname_uniqueclientid, содержащийся в folders ..?

Новое дерево?

C:\DATA
├───folders
│   ├───FirstName_Lastname_10123
│   │   │   FirstName_Lastname_10123_taxing.rtf
│   │   │   FirstName_Lastname_10123_text.txt
│   │   │
│   │   └───FirstName_Lastname_10123_taxing
│   ├───FirstName_Lastname_10124
│   │   │   FirstName_Lastname_10124_data.rtf
│   │   │   FirstName_Lastname_10124_text.txt
│   │   │
│   │   └───FirstName_Lastname_10124_numbers
│   └───FirstName_Lastname_10125
│       │   FirstName_Lastname_10125.rtf
│       │   FirstName_Lastname_10125_text.txt
│       │
│       └───FirstName_Lastname_10125_names
└───Raw

РЕДАКТИРОВАТЬ: (рабочий раствор)

Если это действительно был ваш вопрос, то это рабочее решение вашей проблемы. Имейте в виду, что все функции, кодовые блоки и процессы имеют Rem |, что объясняет это шаг за шагом в коде.

Таким образом, используя основы вашего кода, мы можем получить uniqueclientid и оттуда мы установим это как строку с именем FolderIDNumber. Эта строка будет использоваться внутри find для отображения только допустимых папок внутри циклов dir.

Поскольку основная папка folders name_surname_uniqueclientid используется в цикле, мы можем свободно обрабатывать файлы в Raw для перемещения. Это легко, так как теперь у нас есть все данные для dir. Причина, по которой у нас два цикла dir, заключается в том, что один захватывает только папки, а другой - только файлы. Таким образом, мы можем COPY правильно переместить их в указанную папку name_surname_uniqueclientid .

@echo off
@setlocal enabledelayedexpansion

Rem | Configure Directories
Set "FolderLocation=C:\DATA\folders"
Set "RawLocation=C:\DATA\Raw"

Rem | Get All Folders Locations In X Directory
for /d %%A in ("!FolderLocation!\*") do (

    Rem | Set Raw Location
    Set "FoldersLoc=%%A"

    Rem | Get Each ID# From %%A
    for /f "tokens=3 delims=_" %%B in ("%%A") do (

        Rem | Set Folders ID#
        Set "FolderIDNumber=%%B"

    )

    Rem | Get Each Folder W/H !FolderIDNumber!
    for /f "tokens=*" %%C in ('Dir "!RawLocation!\" /B /A:D^| find "!FolderIDNumber!"') do (

        Rem | Set Raw Location & Name
        Set "RawFolderLoc=!RawLocation!\%%C"
        Set "RawFoldersName=%%~nC"

        Rem | Move Folders
        robocopy "!RawFolderLoc!" "!FoldersLoc!\!RawFoldersName!" /E /NJH /NJS /NDL /NFL /NC /NS>NUL

    )

    Rem | Get Each File W/H !FolderIDNumber!
    for /f "tokens=*" %%D in ('Dir "!RawLocation!\*.*" /B /A-D^| find "!FolderIDNumber!"') do (

        Rem | Set Raw Location
        Set "RawFileLoc=!RawLocation!\%%D"

        Rem | Move Files
        copy "!RawFileLoc!" "!FoldersLoc!">NUL

    )

)
goto :EOF

Для получения справки по любой из команд выполните следующее:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • И так далее.
...