Скопируйте файл, включая его относительный путь - PullRequest
6 голосов
/ 08 февраля 2011

Мне нужно скопировать большое количество файлов в резервную папку, но я хочу сохранить их относительные пути. Мне нужны только конкретные файлы; т.е.

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: \ backup \ и, похоже, не получает никаких путей. Не уверен, как эта часть будет выполнена.

Ответы [ 4 ]

6 голосов
/ 09 февраля 2011

Примерно так может работать:

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

Это не умно, но быстро и грязно и работает без особых усилий.

3 голосов
/ 18 июня 2013

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

для создания родительских каталогов необходим новый элемент

get-item обеспечивает отображение всех созданных им новых файлов

Конечно, robocopy делает всеэто, но будут времена, когда вы захотите сделать более специальную фильтрацию или искажение имени файла ...

2 голосов
/ 09 февраля 2011

Использовать робокопию.

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

Упс.Я не заметил, что вы тоже хотите добавить расширение .bak.Я все еще думаю, что это хорошая идея, чтобы использовать Robocopy для копирования файлов, то:

1 голос
/ 09 февраля 2011

Вы можете попробовать это

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 } 

новый элемент существует для того, чтобы вызвать создание пути.

Жан Поль

...