复制一个文件,包括它的相对路径

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:\ backup \中,似乎没有获取任何路径。不确定如何完成该部分。
4个回答

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 \”中的replace中加倍那些反斜杠。这是一个正则表达式。 - mjolinor
这���起来可以完成任务。我会试一试,如果它有效的话,我会告诉你的。 - MrGrant

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 工具可以完成这些操作,但有时您可能需要进行更特殊的筛选或更改文件名...


你可以传递 -File 标志给 get-childitem,这样就不必执行 where-object { !$_.PSIsContainer } - Polymorphix

2
使用robocopy命令。
robocopy c:\scripts c:\backup *.ext1 /s

哎呀,我没有注意到您还想添加.bak扩展名。我仍然认为使用robocopy复制文件是个好主意:

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

1
我可以使用Robocopy来完成这个任务,但我想看看是否有一种纯粹使用PowerShell的方法。 - MrGrant

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 } 

new-item 是为了强制创建路径。

Jean Paul


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接