Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件以创建具有可变前缀的文件夹_Batch File_Directory_Prefix - Fatal编程技术网

Batch file 批处理文件以创建具有可变前缀的文件夹

Batch file 批处理文件以创建具有可变前缀的文件夹,batch-file,directory,prefix,Batch File,Directory,Prefix,我正在尝试使用前缀批量创建文件夹,其中前缀是项目名称。我不知道实现以下结果的最佳方法是什么。提前谢谢。示例如下: 项目名称=项目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\proje

我正在尝试使用前缀批量创建文件夹,其中前缀是项目名称。我不知道实现以下结果的最佳方法是什么。提前谢谢。示例如下:

项目名称=项目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 
@echo off
set /p id= Enter Project ID?
for /f "tokens=*" %%a in (file.txt) do (
mkdir %id%_"%%a"
)
项目名称=项目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 
这是我在浏览此处资源后的尝试。

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 
@echo off
set /p id= Enter Project ID?
for /f "tokens=*" %%a in (file.txt) do (
mkdir %id%_"%%a"
)
其中“file.txt”包含文件夹和子文件夹的名称列表。
项目ID为项目1/2/3

我的问题是

我使用文本文件创建文件夹没有问题,但我不知道如何使用它创建子文件夹。可能吗


如果是,如何将项目id前缀放在子文件夹名称前面?

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

查看文件夹,我假设您希望根据主
project 35;
目录重命名树中的所有文件。下面是一个示例树:

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\u 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
,了解脚本中每个进程的更多信息。此外,您还需要将
设置“MainDir=C:\MainFolderLocation”
更改为您所尊重的包含
project\
文件夹的目录

为了增加安全性,我还添加了一个
集“MustContain=project”
,这样脚本将只修改文件树的who's
project 
contains
project
。如果此目录中有其他文件夹(
C:\MainFolderLocation
),则不会触及不包含project的文件夹。如果这不是您想要的,并且您希望完全调整此目录中的所有内容,则删除
Rem |检查当前文件夹是否包含ProjectX
for循环

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

有关任何命令的帮助,请执行以下操作:

  • 呼叫/?
  • 设置/?
  • 获取/?
  • 如果/?
  • 查找/?
  • 等等

欢迎成为SO的新用户。请带上这本书,同时阅读。不是免费的脚本编写服务。希望有自己的研究和代码尝试。将您的代码包含在a中的问题。您尝试过我的答案吗?嗨,我尝试过,但我无法让它工作。也许我做错了什么。将Createproject 1234放在何处?谢谢,谢谢你的帮助。我对这个完全陌生。“我要花一点时间来看完你的剧本。”艾伦犹豫着,慢慢来。请让我知道你有任何反馈,不要羞于创建一个测试目录,这样你就可以“测试”脚本-看看它是否适合你的需要。不,我实际上想为新项目创建新的文件夹结构,而不是重命名它。但真的很感谢你的帮助。我无法让它工作。也许我做错了什么。将Createproject 1234放在何处?谢谢。将
createproject.bat
放入主文件夹,并使用
createproject 5
执行它(从命令行),其中5是您所需的项目id。最后在命令行上运行它。虽然这不完全是我想要的,但我会进一步研究,并根据我的情况调整一些东西。再次谢谢你。