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

How can i check if a directory exists with wildcars inside an if exist and copy this folder to another location?

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

我已经设法从文件夹名称中提取 ID,检查 "Raw" 文件夹中的文件是否包含此 ID 和 xcopy 到相应的 "folders" 文件夹。据我所知,脚本没有输入最后一个 if。它应该找到包含 id 的文件夹,如果有,则将它们复制到相应的 "folders" 文件夹。

    @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
    |   
    |   
    |   
    |   
    |   
    └───

如果文件夹已经存在合并

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

  1. 因此,为了清楚起见,您有两个主目录 folders & Raw 正确吗?

  2. folders 中包含您命名的每个客户端文件夹 name_surname_uniqueclientid格式正确吗?

  3. Raw 里面你有 "raw client files and folders" 但每个名称格式 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,您希望将它们复制到 folders 中包含的 name_surname_uniqueclientid ..?

新树 ?

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 循环内的有效文件夹。

foldersname_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 /?
  • 等等。

IMO 你的方法还不错,
但不是 if 你需要另一个 for 到 iterate/parse 在 RAW 中找到的 files/folders。

我也会 move 文件,而不是复制:

:: Q:\Test19\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