我如何检查是否存在带有通配符的目录,如果存在并将该文件夹复制到另一个位置?
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 并尝试清楚地理解问题)
因此,为了清楚起见,您有两个主目录
folders
& Raw
正确吗?
在 folders
中包含您命名的每个客户端文件夹
name_surname_uniqueclientid
格式正确吗?
在 Raw
里面你有 "raw client files and folders" 但每个名称格式 name_surname_uniqueclientid
正确吗?
猜测文件夹的实际名称在示例 _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
循环内的有效文件夹。
主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 /?
- 等等。
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
我正在尝试编写一个 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 并尝试清楚地理解问题)
因此,为了清楚起见,您有两个主目录
folders
&Raw
正确吗?在
folders
中包含您命名的每个客户端文件夹name_surname_uniqueclientid
格式正确吗?在
Raw
里面你有 "raw client files and folders" 但每个名称格式name_surname_uniqueclientid
正确吗?猜测文件夹的实际名称在示例
_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
循环内的有效文件夹。
主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 /?
- 等等。
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