复制包含它的相对路径的文件

时间:2011-02-08 17:56:15

标签: powershell powershell-v2.0

我需要将大量文件复制到备份文件夹,但我想保留它们的相对路径。我只需要特定的文件;即。

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 个答案:

答案 0 :(得分:6)

这样的事情可行:

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

这不聪明,但它很快&肮脏而且无需付出很多努力。

答案 1 :(得分:3)

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

需要new-item来创建父目录

get-item提供了它创建的所有新文件的显示

当然robocopy可以做到这一切,但有时候你想要做更多特殊的过滤或文件名修改......

答案 2 :(得分:2)

使用robocopy。

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

糟糕。我没注意到你也想添加.bak扩展名。我仍然认为使用robocopy复制文件是个好主意:

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

答案 3 :(得分: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 } 

新项目是为了强制创建路径。

让·保罗