Исходя из ваших папок, я предполагаю, что вы хотите переименовать все файлы в дереве на основе основного каталога project#
. По примеру дерева ниже:
C:\MainFolder
├───project1
│ ├───export
│ │ ├───DWG
│ │ ├───Images
│ │ ├───PDF
│ │ └───ZIP
│ └───support documents
└───project2
├───export
│ ├───DWG
│ ├───Images
│ ├───PDF
│ └───ZIP
└───support documents
Мы можем использовать серию for
циклов для сбора информации о каждой папке, используя dir "Path\*" /b /s /a:d
. Это позволит нам получить каждую папку от уважаемого MainDir
-> ProjectX
. Отсюда мы просто переименовываем дерево из этой папки ProjectX
в формат ProjectX_OriginalFolderName
. Это даст нам наше новое соответствующее дерево ниже.
C:\MainFolder
├───project1
│ ├───project1_export
│ │ ├───project1_DWG
│ │ ├───project1_Images
│ │ ├───project1_PDF
│ │ └───project1_ZIP
│ └───project1_support documents
└───project2
├───project2_export
│ ├───project2_DWG
│ ├───project2_Images
│ ├───project2_PDF
│ └───project2_ZIP
└───project2_support documents
Сценарий ниже должен решить все ваши проблемы. Пожалуйста, посмотрите на каждый Rem | Note
для получения дополнительной информации о каждом процессе в сценарии. Кроме того, вы захотите изменить Set "MainDir=C:\MainFolderLocation"
на свой уважаемый каталог, содержащий project#
папок.
В качестве дополнительной безопасности я также добавил Set "MustContain=project"
, чтобы скрипт мог изменять только дерево файлов, которое project#
содержит project
. Если у вас есть другие папки в этом каталоге (C:\MainFolderLocation
), те, которые не содержат проект, не будут затронуты. Если это не то, что вам нужно, и вы хотите настроить абсолютно все в этом каталоге, удалите цикл Rem | Check If Current Folder Contains ProjectX
.
EditFolderTree.bat:
@ECHO OFF
@setlocal EnableDelayedExpansion
Rem | Configuration
Set "MainDir=C:\MainFolderLocation"
Set "MustContain=project"
Rem | Get Each Project Folder
for /f "tokens=*" %%A in ('dir "!MainDir!\" /b /a:d') do (
Set "MainFolder=%%~nA"
Rem | Check If Current Folder Contains ProjectX
for /f "tokens=*" %%B in ('echo !MainFolder!^| find /I "!MustContain!"') do (
Set "BaseFolderName=%%~nB"
Rem | Get Each Folder In ProjectX Dir
for /f "tokens=*" %%C in ('dir "!MainDir!\!BaseFolderName!\*" /b /s /a:d') do (
Set "FolderName=%%C"
Rem | Check If Current Folder Already has ProjectX_
for /f "tokens=*" %%D in ('echo !FolderName!^| find /V "!BaseFolderName!_"') do (
Rem | Save Results To File
Echo %%D >> DataFile.temp
)
)
)
)
Rem | Check If DataFile.temp Exists
If exist "%~dp0DataFile.temp" (
Rem | Reverse Tree From TextFile
for /F "tokens=*" %%A in (DataFile.temp) do (
set /A I=!I! + 1
set LINE!I!=%%A
)
Del %~dp0DataFile.temp
for /L %%A in (!I!,-1,1) do (
echo !LINE%%A! >> DataFile.temp
)
Rem | Read TextFile & Get Paths
for /F "tokens=*" %%A in (DataFile.temp) do (
Set "FolderName=%%~nA"
Rem | Get project Number
Set "String=%%A"
Set "String=!String:%MainDir%\=!"
for /F "tokens=1,2* delims=\" %%B in ('Echo !String!') do (
Set "BaseFolderName=%%B"
)
Rem | Rename Folders
CD "%%A\.."
rename "!FolderName!" "!BaseFolderName!_!FolderName!"
)
Del %~dp0DataFile.temp
)
goto :EOF
Для получения справки по любой из команд выполните следующее:
call /?
set /?
for /?
if /?
find /?
- Так далее.