2011-02-08 14 views
6

Potrzebuję skopiować dużą liczbę plików do folderu kopii zapasowej, ale chcę zachować ich względne ścieżki. Potrzebuję tylko określonych plików; tjSkopiuj plik ze ścieżką względną

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

Ale wystarczy skopiować pliki ZEWN1 tak:

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

Ścieżki źródłowe są od wielu głębokościach. To jest to, co mam do skopiowania plików:

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

To właśnie zrzuca wszystkie pliki w katalogu C: \ Backup \ i nie wydaje się, aby któryś z tych ścieżek. Nie jestem pewna, jak ta część zostanie wykonana.

Odpowiedz

6

Coś takiego może działać:

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

To nie jest mądry, ale to szybki & brudne i działa bez dużego wysiłku.

+1

Może chcieć podwoić backslawy w "C: \ scripts \" w replice. To jest wyrażenie regularne. – mjolinor

+0

Oczywiście, thx. Zawsze o tym zapominam :) – stej

+0

Wygląda na to, że wykona to zadanie. Dam ci szansę i dam ci znać, jeśli to zadziała. – MrGrant

1

Można spróbować tej

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 } 

nowy-przedmiot jest tam, aby wymusić utworzenie ścieżki.

Jean Paul

2

Zastosowanie robocopy.

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

Ups. Nie zauważyłem, że chcesz też dodać rozszerzenie .bak. Nadal uważam, że jest to dobry pomysł, aby użyć robocopy skopiować pliki następnie:

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

Mogłem to zrobić z robocopy tak, ale chciałem zobaczyć, czy był sposób, aby to zrobić z czysto powershell. – MrGrant

3

get-ChildItem zwraca ścieżek bezwzględnych, ale możesz je względem bieżącego katalogu roboczego w następujący sposób:

resolve-path -relative 

Więc skopiować przefiltrowany zbiór plików z bieżącego katalogu rekurencyjnie do katalogu docelowego: konieczna jest

$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; } 

nowej pozycji, aby stworzyć katalogi nadrzędne

get-item zapewnia wyświetlanie wszystkich nowych plików stworzył

oczywiście robocopy to wszystko, ale nie będzie wtedy, gdy chcesz zrobić bardziej specjalnego filtrowania lub nazwy pliku maglowania ...

+0

Możesz przekazać flagę '-File' do' get-childitem', a więc nie musisz wykonywać 'where-object {! $ _. PSIsContainer}' – Polymorphix

Powiązane problemy