如何复制文件夹,然后将Batch或Powershell中的文件夹和文件重命名为多个文件夹

时间:2017-05-21 04:23:19

标签: powershell batch-file

假设我有这个文件夹结构:

02548 //let's call this MASTER FOLDER, folder name are using site_id
|- 1. Master File
  |- 02548_MSFI.pdf
|- 2. src
  |- 02548_main.cpp
|- 3. Backup
  |- alpha.svn

我还有site_id.txt文件包含side_id的名称:

02548
03584
05482
07992
05861

我想要做的是将 MASTER FOLDER 复制到新文件夹。所以,最终结果将是这样的:

|-02548 // MASTER FOLDER
| |- 1. Master File
|   |- 02548_MSFI.pdf
|  |- 2. src
|    |- 02548_main.cpp
|  |- 3. Backup
|    |- alpha.svn
|-03584 //the folder name are taken from the list inside the site_id.txt
| |- 1. Master File
|   |- 03584_MSFI.pdf //please notice the prefix of this file's name
|  |- 2. src
|    |- 03584_main.cpp //please notice the prefix of this file's name
|  |- 3. Backup
|    |- alpha.svn
|-05482 //the folder name are taken from the list inside the site_id.txt
| |- 1. Master File
|   |- 05482_MSFI.pdf //please notice the prefix of this file's name
|  |- 2. src
|    |- 05482_main.cpp //please notice the prefix of this file's name
|  |- 3. Backup
|    |- alpha.svn

and so on until all the site_id from site_id.txt are here.

在现实世界中,site_id.txt将包含超过1000个列表。因此,手动执行此操作将非常痛苦。 如何使用批处理脚本或PowerShell执行此操作?

3 个答案:

答案 0 :(得分:1)

不知道你会怎么做,但如果我找到一份工作并且该任务被分配给我,我就会这样做:

Address 10.11.12.13   -> 00001010000010110000110000001101
Mask    255.255.192.0 -> 11111111111111111100000000000000
                     AND ================================
Network               -> 00001010000010110000000000000000 -> 10.11.0.0

您需要更改@ECHO OFF SETLOCAL SET "sourcedir=U:\sourcedir" SET "destdir=U:\destdir" SET "filename1=%sourcedir%\q44093158.txt" FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO ( XCOPY /s /e "%sourcedir%\t w o\*" "%destdir%\%%a\" >nul FOR /f "delims=" %%p IN ('dir /s /b "%destdir%\%%a\*#*"') DO ( SET "filename=%%~nxp" CALL set "filename=%%filename:#=%%a%%" CALL REN "%%p" "%%filename%%" ) ) GOTO :EOF sourcedir的设置以适合您的具体情况。

我使用了一个名为destdir的文件,其中包含我的测试数据。

在源目录中,(我实际测试时附加了q44093158.txt以确保它与包含空格的目录名一起工作),构建包含master文件的结构,其中branch-number替换为\t w o

代码只读取#,其中包含一行的分支名称,复制目标的目录结构,然后查找包含filename1的文件名。使用这些文件,它会替换#的分支名称并重命名文件。

完成!

答案 1 :(得分:0)

此PowerShell脚本和文件site_id.txt应放在02548

的父文件夹中
## C:\Test\Copy-Template.ps1
$template = '02548'
foreach ($site in (Get-Content site_id.txt)) {
   Get-ChildItem $template -recurse | Foreach-Object {
     $NewName = $_.FullName -replace $template,$site
     if ($_.PSIsContainer){
       if (!(Test-path $NewName)){md $NewName|Out-Null}
     } else {
       copy $_.FullName $NewName -EA 0
     }
  }
}

示例输出:

> tree /F
C:.
│   Copy-Template.ps1
│   site_id.txt
│
└───02548
    ├───1. Master File
    │       02548_MSFI.pdf
    │
    ├───2. src
    │       02548_main.cpp
    │
    └───3. Backup
            alpha.svn

> .\Copy-Template.ps1
> tree /f
C:.
│   Copy-Template.ps1
│   site_id.txt
│
├───02548
│   ├───1. Master File
│   │       02548_MSFI.pdf
│   │
│   ├───2. src
│   │       02548_main.cpp
│   │
│   └───3. Backup
│           alpha.svn
│
├───03584
│   ├───1. Master File
│   │       03584_MSFI.pdf
│   │
│   ├───2. src
│   │       03584_main.cpp
│   │
│   └───3. Backup
│           alpha.svn
│
├───05482
...
├───05861
...
└───07992
    ├───1. Master File
    │       07992_MSFI.pdf
    │
    ├───2. src
    │       07992_main.cpp
    │
    └───3. Backup
            alpha.svn

答案 2 :(得分:0)

@echo off
setlocal EnableDelayedExpansion

rem Call the subroutine, read data from site_id file
call :DuplicateTree < site_id.txt
goto :EOF


:DuplicateTree

rem Read MasterFolder from first line
set /P "masterFolder="

:nextFolder
   rem Read and process next folders until EOF
   set /P "nextFolder="
   if errorlevel 1 exit /B

   rem Duplicate folders first
   md "%nextFolder%"
   for /R "%masterFolder%" /D %%a in (*) do (
      set "folder=%%a"
      set "folder=!folder:*%cd%\=!"
      md "!folder:%masterFolder%=%nextFolder%!"
   )

   rem Duplicate files
   for /R "%masterFolder%" %%a in (*) do (
      set "file=%%a"
      set "file=!file:*%cd%\=!"
      copy "%%a" "!file:%masterFolder%=%nextFolder%!"
   )
goto nextFolder

将此批处理文件放在包含site_id.txt文件和02548主文件夹的同一文件夹中。