Пакетный файл для создания папок с переменным префиксом - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать папки в пакетном режиме с префиксом, где префикс является именем проекта. Я не знаю, каков наилучший способ достижения результата, как показано ниже. Заранее спасибо. Пример сильфон:

Название проекта = Проект 1

project-1_export\project-1_DWG  
project-1_export\project-1_IMAGES 
project-1_export\project-1_PDF 
project-1_export\project-1_ZIP 
project-1_LIBRARY 
project-1_SUPPORT DOCUMENTS\project-1_Scans 
project-1_SUPPORT DOCUMENTS\project-1_PDF\project-1_Client 
project-1_SUPPORT DOCUMENTS\project-1_PDF\project-1_Others 

Название проекта = Проект 2

project-2_export\project-2_DWG  
project-2_export\project-2_IMAGES 
project-2_export\project-2_PDF 
project-2_export\project-2_ZIP 
project-2_LIBRARY 
project-2_SUPPORT DOCUMENTS\project-2_Scans 
project-2_SUPPORT DOCUMENTS\project-2_PDF\project-2_Client 
project-2_SUPPORT DOCUMENTS\project-2_PDF\project-2_Others 

Это моя попытка после просмотра ресурса здесь.

@echo off
set /p id= Enter Project ID?
for /f "tokens=*" %%a in (file.txt) do (
mkdir %id%_"%%a"
)

где 'file.txt' содержит список имен папок и подпапок.
и идентификатор проекта - проект 1/2/3

Мои вопросы

У меня нет проблем с использованием текстового файла для создания папок, но я не знаю, как использовать его для создания подпапок. Возможно ли это?

Если да, как поставить префикс идентификатора проекта перед именем подпапки?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Исходя из ваших папок, я предполагаю, что вы хотите переименовать все файлы в дереве на основе основного каталога 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 /?
  • Так далее.
0 голосов
/ 11 января 2019

CreateProject.bat

@echo off
if "%~1" == "" goto :help
md "project-%~1_export\project-%~1_DWG  
md "project-%~1_export\project-%~1_IMAGES 
md "project-%~1_export\project-%~1_PDF 
md "project-%~1_export\project-%~1_ZIP 
md "project-%~1_LIBRARY 
md "project-%~1_SUPPORT DOCUMENTS\project-%~1_Scans 
md "project-%~1_SUPPORT DOCUMENTS\project-%~1_PDF\project-%~1_Client 
md "project-%~1_SUPPORT DOCUMENTS\project-%~1_PDF\project-%~1_Others 
goto :eof
:help
echo to create the folderstructure for a project 1, type:
echo %~n0 1

Вызовите его с номером проекта (или именем?) В качестве параметра:

createproject 1234
...