如何检查目录中是否存在带通配符的目录(如果存在)并将该文件夹复制到另一个位置?

时间:2019-01-10 01:02:10

标签: batch-file directory exists xcopy dirname

我试图编写一个bat脚本,以便更好地组织客户文件。 我已经创建了两个文件夹。 第一个名为“文件夹” ,其中包含每个客户端的文件夹及其文件。每个客户端的文件夹名称都具有结构名称name_surname_uniqueclientid。 第二个名为“ Raw” ,其中包含原始客户端文件和文件夹,但是每个文件夹或文件在其名称内均包含唯一的客户端ID。 我的目标是从每个“文件夹”文件夹中提取每个ID,并检查“ Raw” 文件夹中是否有包含该ID的文件或文件夹。如果有的话,应该在对应的具有相同ID的“文件夹” 文件夹中 xcopy
我的问题是我无法检查包含ID的文件夹并将其移动到相应的“文件夹”文件夹。

我设法从文件夹名称中提取ID,检查“原始” 文件夹中包含此ID的文件,并 xcopy 将它们复制到相应的”文件夹” 文件夹。据我所知,脚本不会输入最后一个if。它应该找到包含id的文件夹,如果有,则将它们复制到相应的“文件夹”文件夹中。

    @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

之后

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 :(得分:1)

问题?(我知道这会被否决,但是我想帮助OP并尝试清楚地理解问题)

  1. 因此,为清楚起见,您有两个名为 foldersRaw对吗?

  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循环的原因是,一个循环仅抓取Folders,另一个仅抓取File。这样,我们可以将它们正确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 /?
  • 等等。

答案 1 :(得分:1)

IMO,您的方法还不错,
但是您需要另一个if来迭代/解析RAW中找到的文件/文件夹,而不是for

我也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