2017-05-21 20 views
0

比方說,我有這樣的文件夾結構:如何複製文件夾,然後在批處理或PowerShell的重命名文件夾和文件裏面多個文件夾

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來執行此操作?

+0

你到目前爲止嘗試過什麼,你卡在哪裏?關於StackOverflow不是免費的代碼寫作服務! – aschipfl

回答

1

不知道你會怎麼做,但是這是我會怎麼做,如果我有一份工作和任務分配給我:

@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 

您需要更改的設置sourcedirdestdir以適合您的情況。

我用了一個名爲q44093158.txt的文件,其中包含我的測試數據。

在源目錄,(I實際上\t w o所附,以確保它與包含空格的數據夾工作測試),建立包括主文件與由#

替換分​​支數的代碼只是讀取filename1結構其中包含一行到一行的分支名稱,複製目標位置的目錄結構,然後查找包含#的文件名。使用這些文件,它會將分支名稱替換爲#並重命名該文件。

完成!

+0

我試過這個腳本,它可以複製文件夾和文件,但新文件夾上的文件名仍然使用MASTER FOLDER site_id。我所做的只是改變了「sourcedir」,「destdir」和「t w o」。 – noobsee

+0

我發現在腳本的末尾它在該行中拋出「文件未找到」** CALL REN「%% p」「%% filename %%」**,我想它沒有得到「%% p 「來自界限的varibale? – noobsee

+0

模板結構應該在像「c:\ template」這樣的目錄下,作爲「sourcedir \ two」,它需要你的整個'02548'子樹的副本及其所有文件的名稱改爲'#whatever' '02548whatever'。這個想法是,你有一個模板文件結構和複製和使用'#'作爲指示器被重命名的文件集被替換爲分支名稱 – Magoo

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 
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主文件夾。

相關問題