2011-03-25 63 views
26

我有一個看起來像這樣的目錄結構:如何使用PowerShell的複製項目,並保持結構

c:\folderA\folderB\folderC\client1\f1\files 
c:\folderA\folderB\folderC\client1\f2\files 
c:\folderA\folderB\folderC\client2\f1\files 
c:\folderA\folderB\folderC\client2\f2\files 
c:\folderA\folderB\folderC\client3\f1\files 
c:\folderA\folderB\folderC\client4\f2\files 

我想在c F1文件夾中的內容複製:\ tmp目錄\得到這個

c:\tmp\client1\f1\files 
c:\tmp\client2\f1\files 
c:\tmp\client3\f1\files 

我嘗試這樣做:

copy-item -recur -path: "*/f1/" -destination: c:\tmp\ 

但它沒有複製正確複製結構的內容。

回答

9

使用xcopyrobocopy,這兩者都是專門爲此設計的。當然,假設你的路徑只是文件系統路徑。

+2

我知道,但我希望在PowerShell中這樣做,因爲這是更大腳本的一部分,我將使用-PassThru將複製的輸出傳遞給其他命令。 – Sylvain 2011-03-25 15:40:12

+0

您可以使用'cmd/c xcopy'從powershell使用xcopy – 2014-04-13 01:46:42

+0

@ZacharyYates:您可以使用'xcopy'從PowerShell使用xcopy。它不是'cmd'內置的,所以在這裏不需要'cmd/c'。 – Joey 2014-04-13 08:30:09

3

容器開關維護文件夾結構。請享用。

testing>> tree 
Folder PATH listing 
Volume serial number is 12D3-1A3F 
C:. 
├───client1 
│ ├───f1 
│ │ └───files 
│ └───f2 
│  └───files 
├───client2 
│ ├───f1 
│ │ └───files 
│ └───f2 
│  └───files 
├───client3 
│ └───f1 
│  └───files 
└───client4 
    └───f2 
     └───files 
testing>> ls client* | % {$subdir=(join-path $_.fullname f1); $dest=(join-path temp ($_ 
.name +"\f1"));if(test-path ($subdir)){ copy-item $subdir $dest -recurse -container -fo 
rce}} 
testing>> tree 
Folder PATH listing 
Volume serial number is 12D3-1A3F 
C:. 
├───client1 
│ ├───f1 
│ │ └───files 
│ └───f2 
│  └───files 
├───client2 
│ ├───f1 
│ │ └───files 
│ └───f2 
│  └───files 
├───client3 
│ └───f1 
│  └───files 
├───client4 
│ └───f2 
│  └───files 
└───temp 
    ├───client1 
    │ └───f1 
    │  └───files 
    ├───client2 
    │ └───f1 
    │  └───files 
    └───client3 
     └───f1 
      └───files 
testing>> 
+0

雖然你的回答是正確的,但不清楚,可能要在頂部添加一個非常簡單的示例調用來幫助說明。我讀了答案,但似乎令人費解,所以我繼續尋找另一種解決方案(回來後,我發現它的解決方案與我發現的相同,但不盡如人意)。 – workabyte 2014-08-20 15:41:06

2

我需要做同樣的事情,所以我發現這個命令:

XCopy souce_path destination_path /E /C /I /F /R /Y 

而且你的情況:

XCopy c:\folderA\folderB\folderC c:\tmp /E /C /I /F /R /Y 

如果你需要排除一些項目,創建帶有排除列表的文本文件。例如:

C盤上創建的文本文件 'exclude.txt':\,並在其中添加此:

.svn 
.git 

而且你的複製命令看起來像現在這樣:

XCopy c:\folderA\folderB\folderC c:\tmp /EXCLUDE:c:\exclude.txt /E /C /I /F /R /Y 
+0

這就是我一直在尋找的感謝。我也用/ w和/ S來複制子目錄並跳過空文件夾 – 2013-05-16 05:30:04

10

PowerShell的:

$sourceDir = 'c:\folderA\folderB\folderC\client1\f1' 
$targetDir = ' c:\tmp\' 

Get-ChildItem $sourceDir -filter "*" -recurse | ` 
    foreach{ 
     $targetFile = $targetDir + $_.FullName.SubString($sourceDir.Length); 
     New-Item -ItemType File -Path $targetFile -Force; 
     Copy-Item $_.FullName -destination $targetFile 
    } 

注:

  • -filter「*」不起任何作用。這裏只是爲了說明你是否想複製一些特定的文件。例如。所有* .config文件。
  • 仍然必須使用-Force調用New-Item才能實際創建文件夾結構。
+0

我不明白,這是powershell嗎?還是一個.bat腳本?抱歉,我是NT – 2013-05-14 01:13:30

+1

FWIW的新手,如果您在'$ sourceDir'上放置了尾隨目錄分隔符,則會失敗。 – 2013-06-04 10:41:58

+0

適用於PS 2.0和PS 4.0? Mabye cmdlet中的任何差異。 – Kiquenet 2014-04-21 12:01:17

3

如果你想正確地正確使用PowerShell複製一個文件夾結構,做到像這樣:

$sourceDir = 'C:\source_directory' 
$targetDir = 'C:\target_directory' 

Get-ChildItem $sourceDir -Recurse | % { 
    $dest = $targetDir + $_.FullName.SubString($sourceDir.Length) 

    If (!($dest.Contains('.')) -and !(Test-Path $dest)) 
    { 
     mkdir $dest 
    } 

    Copy-Item $_.FullName -Destination $dest -Force 
} 

這說明了創建目錄,只是複製文件。當然,如果您想搜索「f1」,就需要修改上面的Contains()調用,前提是您的文件夾包含句點或添加過濾器。

7

還有另一個答案在這裏有相同的解決方案,雖然它不是很清楚,所以我會拋出這個,因爲它花了我一會兒才找到這個答案。

我一直在挖掘,發現了很多解決這個問題的方法,所有這些改動都不僅僅是一個直接的複製項目命令。在PS 3之前將這些問題中的一些給予批准。0所以答案沒有錯,但使用PowerShell 3.0我終於能夠使用-Co​​ntainer開關來完成複製項目。

Copy-Item $from $to -Recurse -Container 

這是我跑的測試,沒有錯誤和目標文件夾代表相同的文件夾結構。

New-Item -ItemType dir -Name test_copy 
New-Item -ItemType dir -Name test_copy\folder1 
New-Item -ItemType file -Name test_copy\folder1\test.txt 
#NOTE: with no \ at the end of the destination the file is created in the root of the destination, does not create the folder1 container 
#Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2 -Recurse -Container 

#if the destination does not exists this created the matching folder structure and file with no errors 
Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2\ -Recurse -Container 

希望這可以幫助別人

23

在PowerShell的3.0版本和更新這個做法僅僅是這樣:

Get-ChildItem -Path $sourceDir | Copy-Item -Destination $targetDir -Recurse -Container 

參考:Get-ChildItem

+1

'-container'標誌是做什麼的? – Cullub 2017-07-12 14:39:16

+1

@Cullub關於'-container'標誌,請參閱[Powershell的Copy-Item的-container參數是什麼意思?](https://stackoverflow.com/questions/129088/what-is-the-meaning-of- powershells-copy-items-container-argument) – browly 2017-08-07 21:53:13

+0

請注意,在這個例子中,'$ targetDir'必須已經存在。在我的測試中,我發現當'$ targetDir'不存在時,文件將被複制,但目錄結構將被平鋪。 – bwerks 2017-10-29 19:16:34

0

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "target=e:\backup" 

    for /f "usebackq delims=" %%a in ("TextFile.txt") do (
     md "%target%%%~pa" 2>nul 
     copy /y "%%a" "%target%%%~pa" 
    ) 
以下工作

對於列表中的每一行(文件),在目標文件夾下創建相同行中指示的相同路徑(%%〜pa是由%% a引用的元素的路徑)。然後,將reared文件複製到目標文件夾

相關問題