使用相对路径复制文件

4
我可以帮助您翻译以下内容:

我想从特定子目录中复制某种类型的所有文件,并保留它们相对于该子目录的路径,将其移至另一个目录并保留相对路径。例如:

源子目录:

c:\temp\sourcedirectory

源文件:

c:\temp\sourcedirectory\tonymontana\fileOne.txt
c:\temp\sourcedirectory\poker\fileTwo.txt

目标目录:

c:\temp\targetdirectory

希望的结果是:
c:\temp\targetdirectory\tonymontana\fileOne.txt
c:\temp\targetdirectory\poker\fileTwo.txt

到目前为止,我想到了以下内容:
Set-Location $srcRoot
Get-ChildItem -Path $srcRoot -Filter $filePattern -Recurse |
    Resolve-Path -Relative |
    Copy-Item -Destination {Join-Path $buildroot $_.FullName}

然而,PowerShell中“一切皆为对象”的理念让我感到困惑(至少我认为是这样)。也就是说,文件被复制了,但是没有它们的相对路径。
有人能否给我一点启示?

1
"有谁能给我一点启示吗?" - 看起来微软把一些简单的东西变得复杂了,以至于它不再起作用。当开发人员不得不上网查找如何使用复制命令时,这真是令人沮丧。这是微软在工程方面的一个史诗级失败。 - jww
@jww 兄弟,你在说什么?常规的复制命令不会复制带有相对路径的文件,从来没有过。这通常需要编写脚本或使用专门的工具,如 xcopyrobocopyrsync 等。 - Ansgar Wiechers
4个回答

9
不必使用PowerShell cmdlets,只需使用robocopy即可:
robocopy C:\temp\sourcedirectory C:\temp\targetdirectory *.txt /s

当PowerShell是你唯一的shell时,你怎么能不使用它呢? - jww
@jww 请仔细阅读。robocopy 在 PowerShell 中的工作方式与在 CMD 中相同。您不需要使用 PowerShell cmdlets 来完成此类任务。 - Ansgar Wiechers
“使用相对路径复制”这个主题并没有通过使用绝对路径的答案得到解决。这个问答是关于如何将一个文件夹结构及其内部文件从一个绝对路径复制到另一个绝对路径的。 - user1748217
1
@user1748217 在问题中给出了源目录和目标目录的绝对路径;这个答案只是使用它们以使其与问题相匹配。关于相对路径的部分是因为OP需要保留与源目录相关的路径。但我认为当源目录和目标目录被给定为相对路径时,这个答案同样适用。 - kaya3

3
您可以尝试以下方法:
$srcroot = "c:\temp\sourcedirectory"
$builroot= "c:\temp\targetdirectory"
gci -path $srcroot -filter $filepattern -recurse | 
  % { Copy-Item $_.FullName -destination ($_.FullName -replace [regex]::escape($srcroot),$builroot) }

这里在替换操作中似乎有些问题,建立目录没有被加入前缀,源文件已经被删除。可能是我自己的“呆!”错误。不管怎样,还是谢谢。 - PistolPete

2

试试这个:

Copy-item $srcRoot -destination $destination -recurse

这将包括相对路径中的实际srcRoot,当然我可以从srcRoot迭代子目录,并根据您的建议将其与过滤器参数一起连接。 - PistolPete

0
为了防止复制文件夹本身,即创建...
c:\temp\targetdirectory\sourcedirectory

进入源文件夹,然后使用通配符代替文件夹作为源:

cd C:\temp\sourcedirectory\
Copy-item * -destination c:\temp\targetdirectory -recurse`

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