我需要将大量文件复制到备份文件夹,但我想保留它们的相对路径。我只需要特定的文件;即。
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 \中,并且似乎没有得到任何路径。不确定如何完成这部分。
答案 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 }
新项目是为了强制创建路径。
让·保罗