首页 > 解决方案 > 如何检查是否存在带有通配符的目录是否存在并将该文件夹复制到另一个位置?

问题描述

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

我已经设法从文件夹的名称中提取 id,检查包含此 id 的“Raw”文件夹中的文件并将它们复制到相应的“folders”文件夹中。据我所知,脚本没有输入最后一个 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
    |   
    |   
    |   
    |   
    |   
    └───

如果文件夹已存在合并

标签: batch-filedirectoryexistsxcopydirname

解决方案


IMO 您的方法并没有那么糟糕,
但是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

推荐阅读