使用Copy-Item复制文件夹 - 不同的行为

时间:2011-05-08 08:10:37

标签: powershell

我希望使用Copy-Item将整个文件夹复制到另一个文件夹。

我的源文件夹c:\base包含一些文件:

├───base    
│       file1.txt
│       file2.txt

我使用以下命令:

Copy-Item c:\base c:\target -recurse

如果目标文件夹(c:\target)存在,该命令将完全按照我的要求复制源文件夹:

├───target
│   └───base    
│           file1.txt
│           file2.txt

如果目标文件夹不存在,该命令会创建目标文件夹(完全按照我的意愿),但现在只复制源文件夹的内容(不包含base文件夹):

├───target    
│       file1.txt
│       file2.txt
  • 为什么会这样?
  • 如何在不创建目标文件夹的情况下使用此复制命令(附加键?)?

2 个答案:

答案 0 :(得分:9)

这是一个已知的错误(有人会说的功能):

http://groups.google.com/group/microsoft.public.windows.powershell/msg/3327f2d1544e7fb6?as_umsgid=6CAEDDC7-0F1A-4B21-8FB0-E6102A16EB51@microsoft.com

  

这种行为IMO,是一种艺术品   提供者和对象管道   powershell使用的模型。你有   习惯了这个想法   导航环境有点奇怪   与其他炮弹相比;它的   显而易见,而不是隐含的,因为   文件系统是其中之一   可以使用的上下文。这带来了   随之而来的是一些奇怪的行为   任何给定路径的目标都是   处理组合   powershell的通用语法和   命令本身,而不是存在   完全由命令处理   像command.com/cmd.exe这样的shell。

答案 1 :(得分:0)

是的,这个真的很讨厌。

如果您想获得一致的复制体验,请使用以下模式:

$copyFrom = 'C:\Foo\Bar\TargetDirectoryToCopy'
$destinationPath = 'D:\Bar\Foo\'

$newItemParams = @{
    Path        = $destinationPath
    ItemType    = 'Directory'
    Force       = $True
}

$copyParams = @{
    Path        = $copyFrom
    Destination = $destinationPath
    Recurse     = $True
    Confirm     = $false
    Force       = $True
}
New-Item @newItemParams
Copy-Item @copyParams

结果

目录 D:\Bar\Foo\ 将嵌套 TargetDirectoryToCopy 目录。

因此,如果有一个文件 C:\Foo\Bar\TargetDirectoryToCopy\FooBar.txt,它的副本将与 D:\Bar\Foo\TargetDirectoryToCopy\FooBar.txt 中的任何其他文件一起创建为 C:\Foo\Bar\TargetDirectoryToCopy