我试图编写一个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
|
|
|
|
|
└───
如果文件夹已经存在,请合并
答案 0 :(得分:1)
问题?(我知道这会被否决,但是我想帮助OP并尝试清楚地理解问题)
因此,为清楚起见,您有两个名为
folders
和Raw
对吗?
在folders
内包含在您的帐户中命名的每个客户文件夹
name_surname_uniqueclientid
格式正确吗?
在Raw
内,您有“原始客户端文件和文件夹”,但每个文件的名称格式为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
,您都希望将其复制到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