【问题标题】:Renaming Folder Structure in Batch批量重命名文件夹结构
【发布时间】:2013-09-24 16:28:21
【问题描述】:

)

为了让公司(我工作的地方)更有条理和更高效地运作,我们为新项目创建了一个经过批准的文件夹结构。

新项目实时项目驻留在文件服务器上,彼此处于同一级别。 (现场项目已经通过规划,新项目有时只能达到规划)

每次启动新项目时,项目文件夹结构都可以精心创建,因此我制作了一个windows批处理文件来创建它。你可以在这里找到它:http://pastebin.com/mnSu5vnk 这部分效果很好!

文件夹结构为:

F:\New Job\Project Name\Project Correspondence

F:\New Job\Project Name\Project Directory

F:\New Job\Project Name\Project Drawings

F:\New Job\Project Name\Project Images

F:\New Job\Project Name\Project Correspondence\Arboriculturalist

F:\New Job\Project Name\Project Correspondence\CGI

F:\New Job\Project Name\Project Correspondence\Client

F:\New Job\Project Name\Project Correspondence\Measured Survey

F:\New Job\Project Name\Project Correspondence\Planning

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)

F:\New Job\Project Name\Project Correspondence\Client\Appointments

F:\New Job\Project Name\Project Correspondence\Client\Fees

F:\New Job\Project Name\Project Correspondence\Planning\LA Planning

F:\New Job\Project Name\Project Correspondence\Planning\Planning Consultants

F:\New Job\Project Name\Project Correspondence\Planning\LA Planning\Planning Application

F:\New Job\Project Name\Project Correspondence\Planning\LA Planning\Pre Application

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)\Arboriculturalist

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)\Contract Administrator

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)\Contractor

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)\LA Building Control

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)\M&E Consultants

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)\Structural Engineer

F:\New Job\Project Name\Project Correspondence\Post Planning Folders (Drop in as and when)\Tender, Specification

F:\New Job\Project Name\Project Drawings\CD Series (Construction Details)

F:\New Job\Project Name\Project Drawings\Drawing Register

F:\New Job\Project Name\Project Drawings\EW Series (External Works)

F:\New Job\Project Name\Project Drawings\Outgoing Drawings

F:\New Job\Project Name\Project Drawings\P Series (Planning)

F:\New Job\Project Name\Project Drawings\RL Drawings (Room Layouts)

F:\New Job\Project Name\Project Drawings\SK Series (Sketch Design)

F:\New Job\Project Name\Project Drawings\X Series (Existing)

F:\New Job\Project Name\Project Drawings\Outgoing Drawings\DWG FILES

F:\New Job\Project Name\Project Drawings\Outgoing Drawings\PDF FILES

问题是一些新项目永远不会进入“Live”状态;但是,那些确实获得了项目编号的人需要在每个子文件夹前加上项目编号。为每个子文件夹添加项目编号前缀的原因是“people”不小心将它们拖到/复制/移动到另一个项目中,这会使事情变得非常混乱!

另一个问题是一些“新项目”已经存在了一段时间(1 年以上)并且没有文件夹结构,因此我需要制作一个批处理文件来检测“新项目”是否是否具有批准的文件夹结构,并酌情重命名。

这是我目前所拥有的,但我认为我的方法完全错误。

@Echo off
:start
set /P ProjNo=Project Number:
set /P ProjAd=Project Address:
cls

Echo New Project Name?
Echo Project Number=%ProjNo%
Echo Project Address= %ProjAd%

set /p proceed=Is this correct? [Y/N]
if /i {%proceed%}=={y} (goto :yes)
if /i {%proceed%}=={yes} (goto :yes)
if /i {%proceed%}=={n} (goto :no)
if /i {%proceed%}=={no} (goto :no)

:no
cls
goto :start

:yes
set "currentpath=%cd%"
set "projfolder=%ProjNo%-%ProjAd%"

:: check if 000-Project Address doesn't exists
echo Does the Project folder exist %currentpath%\%ProjNo%-%ProjAd%?
If NOT exist "%currentpath%\%ProjNo%-%ProjAd%\" 
    (
    echo the folder does NOT exist
        ::check if project folder name doesn't existing
        if NOT exist "%currentpath%\%ProjAd%\" 
        (
            :: rename the folder to 000-Project Address
            echo Renaming Project Folder
            ren "%ProjAd%" "%ProjNo%-%ProjAd%"

            call:TopLevel
        )
        ::if project address name DOES exist
        else 
        (       
            ::enter the folder and check the structure.
            echo Project Folder doesn't need renaming
            call:TopLevel
        )
    )
::-----------------------------------------------------
::      if "000-Project Address" DOES exist
::-----------------------------------------------------

    else 
    (
        Echo There is no need to run this script!
        goto:eof
    )
  )
  ::-----------------------------------------------------
  ::    Recurse Top level
  ::
  ::   If all the "Recommended" directory names exist 
  ::   rename all sub-directories too!
  ::   Else create them all!
  ::-----------------------------------------------------
    :TopLevel 

    CD projfolder
        ::check if there's a project correspondence 
        IF exist "Project Correspondence" 
        (   
            ren "Project Correspondence" "%ProjNo%-Project Correspondence"
            ::rename the child folders
            cd "%ProjNo%-Project Correspondence"
            for /f "tokens=*" %G in ('dir /b /a:d "*"') do ren "%G" "%ProjNo%-%G"
            cd "%ProjNo%-client"
            for /f "tokens=*" %G in ('dir /b /a:d "*"') do ren "%G" "%ProjNo%-%G"
            cd ..\planning\


        )
        else 
        (
            mkdir "%ProjNo%-Project Correspondence"
            callto: 
            ::function makeProjCorrespondence
            call:makeProjCorrespondence %ProjNo% 
        )
        :: check if there's a project directory
        IF exist "Project Directory" 
        (
            ren "Project Directory" "%ProjNo%-Project Directory"
        )
        else 
        (
            mkdir "%ProjNo%-Project Directory"
        )
        if exist "Project Drawings" 
        (
            ren "Project Drawings" "%ProjNo%-Project Drawings"
            ::go to project drawings function
        )
        goto:eof

  :makeProjCorrespondence
  cd "%ProjNo%-Project Correspondence"
    mkdir "%ProjNo%-Planning"
    mkdir "%ProjNo%-Arboriculturalist"
    mkdir "%ProjNo%-CGI"
    mkdir "%ProjNo%-Client"
    mkdir "%ProjNo%-Measured Survey"
    mkdir "%ProjNo%-Post Planning Folders (Drop in as and when)"

    ::Make folders under Planning
    cd "%ProjNo%-Planning"
        mkdir "%ProjNo%-LA Planning"
        mkdir "%ProjNo%-Planning Consultants"
    cd "..\"

    ::Make folders in Client
    cd "%ProjNo%-Client"
        mkdir "%ProjNo%-Appointments"
        mkdir "%ProjNo%-Fees"
    cd "..\"

    ::make Post Planning folders
    cd "%ProjNo%-Post Planning Folders (Drop in as and when)"
        mkdir "%ProjNo%-Arboriculturalist"
        mkdir "%ProjNo%-Contract Administrator"
        mkdir "%ProjNo%-Contractor"
        mkdir "%ProjNo%-LA Building Control"
        mkdir "%ProjNo%-M&E Consultants"
        mkdir "%ProjNo%-Structural Engineer"
        mkdir "%ProjNo%-Tender, Specification"
    cd "..\..\"
    goto:TopLevel

我们将不胜感激提示和建议!

非常感谢

【问题讨论】:

  • 如果您向我们展示您的源和目标结构是什么,也许我们有机会解决它。就目前而言,您要求我们修复无法执行您未解释的事情的代码。为什么每个目录都需要以projno为前缀?它是projno-projname 的子目录这一事实应该避免所有这些复杂性。在这种情况下,您需要做的就是设置一棵空树并将其用作模板; `xcopy /s/e template projno-projname`
  • +1 向我们展示目标文件夹结构 - 用英文解释。
  • 更改后的文件夹结构是什么样的?树中的每个文件夹是否都有 001 前缀到文件夹名称? 001Project Correspondence ?
  • 对造成的混乱表示歉意!首先,我编辑了问题@PeterWright 源文件夹位于我们文件服务器上名为“新项目”的目录中,目标文件夹“实时项目”与“新项目”处于同一级别感谢您阅读我的帖子,我为我糟糕的英语散文道歉。
  • @foxidrive 每个子文件夹都应该有类似000-folder name 的内容我再次编辑了这个问题我希望这能消除混乱。也为我最初的问题措辞不当而道歉。

标签: windows batch-file directory rename


【解决方案1】:

这旨在通过名为c:\database\project daredevil 的文件夹树进行递归,并将001- 添加到树中每个文件夹名称的前面。

@echo off
set "num=001-"
for /d /r "c:\database\project daredevil" %%a in (*) do ren "%%a" "%num%%%~nxa"

此代码将报告丢失的文件夹,并将创建丢失的文件夹。
您可以使num 等于无以创建一组新文件夹。

EDIT2:

@echo off
set "num=001-"
set "project=c:\database\project daredevil"

for %%a in (
"Project Correspondence"
"Project Directory"
"Project Drawings"
"Project Images"
"Project Correspondence\%num%Arboriculturalist"
"Project Correspondence\%num%CGI"
"Project Correspondence\%num%Client"
"Project Correspondence\%num%Measured Survey"
"Project Correspondence\%num%Planning"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)"
"Project Correspondence\%num%Client\%num%Appointments"
"Project Correspondence\%num%Client\%num%Fees"
"Project Correspondence\%num%Planning\%num%LA Planning"
"Project Correspondence\%num%Planning\%num%Planning Consultants"
"Project Correspondence\%num%Planning\%num%LA Planning\%num%Planning Application"
"Project Correspondence\%num%Planning\%num%LA Planning\%num%Pre Application"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)\%num%Arboriculturalist"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)\%num%Contract Administrator"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)\%num%Contractor"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)\%num%LA Building Control"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)\%num%M&E Consultants"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)\%num%Structural Engineer"
"Project Correspondence\%num%Post Planning Folders (Drop in as and when)\%num%Tender, Specification"
"Project Drawings\%num%CD Series (Construction Details)"
"Project Drawings\%num%Drawing Register"
"Project Drawings\%num%EW Series (External Works)"
"Project Drawings\%num%Outgoing Drawings"
"Project Drawings\%num%P Series (Planning)"
"Project Drawings\%num%RL Drawings (Room Layouts)"
"Project Drawings\%num%SK Series (Sketch Design)"
"Project Drawings\%num%X Series (Existing)"
"Project Drawings\%num%Outgoing Drawings\%num%DWG FILES"
"Project Drawings\%num%Outgoing Drawings\%num%PDF FILES"
) do (
   if not exist "%project%\%num%%%~a\" (
      echo "%project%\%num%%%~a\" is missing
      md "%project%\%num%%%~a\" 
   )
)
pause

【讨论】:

  • 我会试一试,看起来比我现有的代码更有效率。您是否建议我调用现有的批处理文件,该批处理文件为没有批准结构的文件夹创建结构?
  • 好的,我来了!检查上面!
  • 我发现您提供了一个批处理文件来创建目录列表。请参阅上面我修改后的帖子。
  • 哇,这比我的一堆代码更容易消化!但是当我运行它时,我得到:The syntax of the command is incorrect.。有什么想法吗?
  • 我已经修改了它以适应这里找到的:link 但是,非常感谢您的帮助,我正在拔头发!
【解决方案2】:

最后的代码是为那些想知道如何做的人准备的!

非常感谢@foxidrive 帮助解决这个问题! :)

@Echo off
:start
set /P ProjNo=Project Number:
set /P ProjName=Project Name:
::usually we clear screen but for the time being... let's not
::cls

Echo Please Confirm Project Details?
Echo Project Number=%ProjNo%
Echo Project Address= %ProjName%

set /p proceed=Is this correct? [Y/N]
if /i {%proceed%}=={y} (goto :yes)
if /i {%proceed%}=={yes} (goto :yes)
if /i {%proceed%}=={n} (goto :no)
if /i {%proceed%}=={no} (goto :no)

:no
cls
goto :start

:yes

set "project=%cd%\%ProjName%"

for %%a in (
"Project Correspondence"
"Project Directory"
"Project Drawings"
"Project Images"
"Project Correspondence\Arboriculturalist"
"Project Correspondence\CGI"
"Project Correspondence\Client"
"Project Correspondence\Measured Survey"
"Project Correspondence\Planning"
"Project Correspondence\Post Planning Folders (Drop in as and when)"
"Project Correspondence\Client\Appointments"
"Project Correspondence\Client\Fees"
"Project Correspondence\Planning\LA Planning"
"Project Correspondence\Planning\Planning Consultants"
"Project Correspondence\Planning\LA Planning\Planning Application"
"Project Correspondence\Planning\LA Planning\Pre Application"
"Project Correspondence\Post Planning Folders (Drop in as and when)\Arboriculturalist"
"Project Correspondence\Post Planning Folders (Drop in as and when)\Contract Administrator"
"Project Correspondence\Post Planning Folders (Drop in as and when)\Contractor"
"Project Correspondence\Post Planning Folders (Drop in as and when)\LA Building Control"
"Project Correspondence\Post Planning Folders (Drop in as and when)\M&E Consultants"
"Project Correspondence\Post Planning Folders (Drop in as and when)\Structural Engineer"
"Project Correspondence\Post Planning Folders (Drop in as and when)\Tender, Specification"
"Project Drawings\CD Series (Construction Details)"
"Project Drawings\Drawing Register"
"Project Drawings\EW Series (External Works)"
"Project Drawings\Outgoing Drawings"
"Project Drawings\P Series (Planning)"
"Project Drawings\RL Drawings (Room Layouts)"
"Project Drawings\SK Series (Sketch Design)"
"Project Drawings\X Series (Existing)"
"Project Drawings\Outgoing Drawings\DWG FILES"
"Project Drawings\Outgoing Drawings\PDF FILES"
) do (
   if not exist "%project%\%%~a\" (
      echo "%project%\%%~a\" is missing
      md "%project%\%%~a\"
   )
)
::Now add the prefixing number!
for /d /r "%project%" %%a in (*) do ren "%%a" "%ProjNo%-%%~nxa"

ren "%ProjName%" "%ProjNo%-%ProjName%"
Echo Project %ProjName folder has now been renamed to %ProjNo%-%ProjName%
pause

【讨论】:

  • 这是个好主意 - 它使脚本的维护变得更容易。如果未提供编号,该脚本仍将创建一组标准文件夹。
【解决方案3】:

我有点失望,我关于模板目录的建议没有被采纳,所以这里有另一个解决方案。请注意,对所需结构(还有更多目录等)的更改将是自动的 - 无需更改批处理...

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir\project template"
SET "destdir=c:\destdir"

SET "num=001-"
SET "project=project daredevil"

FOR /f "delims=" %%a IN (
 ' dir /s/b /ad "%sourcedir%" '
) DO (
 CALL :makecopy "%%a"
)

GOTO :EOF
:makecopy
SET "srce=%~1"
CALL SET "dest=%%srce:%sourcedir%\=%destdir%\%%
CALL SET "dest=%%dest:#=%num%%%
ECHO MD "%dest%"
IF NOT EXIST "%srce%\*" GOTO :eof
FOR %%i IN ("%srce%\*") DO (
IF NOT EXIST "%dest%\%%~nxi" ECHO COPY /b "%%i" "%dest%\%%~nxi"
)
GOTO :EOF

(请注意 MDs 和 COPYs 只是 ECHOed 用于测试 - 删除 ECHO 以执行

这里的一个好处是,通过在%sourcedir%下面设置一个结构,当结构发生变化时,你只需要修改模板即可。

请注意,目录名中的任何# 在执行时都会被%num% 替换,因此很容易选择是否以及在何处注入项目号。

另一个优点是,一个常见的表格(例如包含免责声明、表格、法律文件夹的空白电子表格或 doc 文件)也可以放置在模板结构中。例如,如果提交需要一系列步骤,您可以使用一个简单的电子表格来指定需要采取的步骤,并在列中记录谁、何时以及文档参考号。


为了澄清、扩展和举例,num 设置为 001-

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir\project template"
SET "destdir=c:\destdir"

SET "num=001-"
SET "project=project daredevil"

FOR /f "delims=" %%a IN (
 ' dir /s/b /ad "%sourcedir%" '
) DO (
 CALL :makecopy "%%a"
)

GOTO :EOF
:makecopy
SET "srce=%~1"
CALL SET "dest=%%srce:%sourcedir%\=%destdir%\%%
CALL SET "dest=%%dest:#=%num%%%
ECHO MD "%dest%"
IF NOT EXIST "%srce%\*" GOTO :eof
FOR %%i IN ("%srce%\*") DO (
 SET fname=%%~nxi
 CALL :subsfn
)
GOTO :EOF
:subsfn
CALL SET "mfname=%%fname:#=%num%%%
IF NOT EXIST "%dest%\%mfname%" ECHO COPY /b "%sourcedir%\%fname%" "%dest%\%mfname%"
GOTO :EOF

Dir structure:

c:\sourcedir\project template\some directory
c:\sourcedir\project template\some#directory
c:\sourcedir\project template\some#directory\a filename.txt
c:\sourcedir\project template\some#directory\a#filename.txt

Run result:

MD "c:\destdir\some directory"
MD "c:\destdir\some001-directory"
COPY /b "c:\sourcedir\project template\a filename.txt" "c:\destdir\some001-directory\a filename.txt"
COPY /b "c:\sourcedir\project template\a#filename.txt" "c:\destdir\some001-directory\a001-filename.txt"

【讨论】:

  • 非常好!!我们在项目目录中有一个模板文档文件和标题文件之类的用于与客户通信的文件,这很花哨!谢谢老哥!!
  • 你好彼得,我一直在测试你的脚本,我真的很喜欢这个想法,但是,我发现文件夹没有用前缀数字重命名,你能告诉我吗通过这个?
  • 如果在project template 下有一个名为somesubdirectory 的子目录,那么somesubdirectory 将在project daredevil 下创建,但是如果该目录名为s#m#subdirectory,那么每个# 将被替换为num 的内容因此是 s001-m001-subdirectory。将# 放在您喜欢的任何地方。我发布了一个编辑以允许使用文件名提取相同的技巧,因此出现在文件名中的 # 将替换为 num 的内容
  • 您是否建议换一份新工作(无编号)将# 替换为空白?
  • 如果你喜欢。当然,如果您不设置num(或只响应输入what num 提示),那么您不需要两个脚本。我用 # 替换为 %num% - 没有理由为什么 @ 不能替换为 %somethingelse%$ 替换为 %yetanotherthing% - 或全部三个。同样,您可以设置多个模板并从菜单中选择所需的模板/空白表格 - 用于州或城市或其他分类。
猜你喜欢
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2017-08-18
  • 2015-12-03
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多