2011-02-08 50 views
6

我需要將大量文件複製到備份文件夾,但我想維護它們的相對路徑。我只需要特定的文件;即複製包含相對路徑的文件

C:\scripts\folder\File.ext1 
C:\scripts\folder2\file2.ext2 
C:\scripts\file3.ext1 

但我只需要到EXT1文件複製像這樣:

C:\backup\folder\File.ext1.bak 
C:\backup\file3.ext1.bak 

源路徑是多深的。 這就是我要複製的文件:

$files = gci -path C:\scripts\ -recurse -include *.ext1 
$files | % { Copy-Item $_ "$($_).bak"; move-item $_ -destination C:\backup\ } 

這只是轉儲所有的文件到C:\備份\並沒有出現得到任何的路徑。不知道這部分將如何完成。

回答

6

像這樣的東西可以工作:

gci -path C:\scripts\ -recurse -include *.ext1 | 
    % { Copy-Item $_.FullName "$($_.FullName).bak" 
     move-item $_.FullName -destination ($_.FullName -replace 'C:\\scripts\\','C:\backup\') } 

這是不聰明的,但它的快速&髒,沒有很多的努力工作。

+1

可能要在替換中的'C:\ scripts \'中加倍反斜槓。這是一個正則表達式。 – mjolinor 2011-02-08 23:20:27

+0

當然,thx。我總是忘記:) – stej 2011-02-08 23:52:13

+0

這看起來像它會做的工作。我會給它一個鏡頭,讓你知道它是否有效。 – MrGrant 2011-02-10 04:14:19

1

你可以試試這個

Clear-Host 
$from = "'C:\scripts\" 
$to = "'C:\backup\" 
$inc = @('*.ext1', '*.extx') 
$files = get-childItem -path $from -include $inc -Recurse 
$files | % {$dest = (Join-Path $to $($_.FullName+".bak").SubString($from.length)); $dum = New-Item -ItemType file $dest -Force; Copy-Item -Path $_ -Destination $dest -Recurse -Force } 

的新產品有,以迫使路徑創建。

Jean Paul

2

使用robocopy。

robocopy c:\scripts c:\backup *.ext1 /s 

糟糕。我沒有注意到你也想添加.bak擴展名。我仍然認爲這是使用ROBOCOPY的文件,然後複製一個好主意:

dir c:\backup -recurse -include *.ext1 | % { ren $_ "$_.bak" } 
3

得到-childitem返回絕對路徑,但你可以如下使它們相對於當前的工作目錄:

resolve-path -relative 

所以從當前目錄中的過濾的文件複製到遞歸一個目標目錄:需要

$dest = "c:\dest" 
$filter = "*.txt" 

get-childitem -recurse -include $filter | ` 
    where-object { !$_.PSIsContainer } | ` 
    resolve-path -relative | ` 
    % { $destFile = join-path $dest $_; new-item -type f $destFile -force | out-null; copy-item $_ $destFile; get-item $destfile; } 

新項目創建的父目錄

獲取項目提供了所有的新文件的顯示它創造

當然ROBOCOPY中做這一切,但會有時候,你希望做更多的特殊過濾或文件名的mangling ...

相關問題