Copy-Item应该创建目标目录结构吗?

时间:2011-09-23 01:58:27

标签: powershell

我正在尝试将文件复制到新位置,维护目录结构。

$source = "c:\some\path\to\a\file.txt"
destination = "c:\a\more\different\path\to\the\file.txt"

Copy-Item  $source $destination -Force -Recurse

但我得到DirectoryNotFoundException

Copy-Item : Could not find a part of the path 'c:\a\more\different\path\to\the\file.txt'

6 个答案:

答案 0 :(得分:88)

-recurse选项仅在源是目录时才创建目标文件夹结构。当源是文件时,Copy-Item要求目标是已存在的文件或目录。您可以通过以下几种方式解决这个问题。

选项1:复制目录而不是文件

$source = "c:\some\path\to\a\dir"; $destination = "c:\a\different\dir"
# No -force is required here, -recurse alone will do
Copy-Item $source $destination -Recurse

选项2:'首先触摸'文件,然后覆盖它

$source = "c:\some\path\to\a\file.txt"; $destination = "c:\a\different\file.txt"
# Create the folder structure and empty destination file, similar to
# the Unix 'touch' command
New-Item -ItemType File -Path $destination -Force
Copy-Item $source $destination -Force

答案 1 :(得分:2)

我一直在挖掘并找到了很多解决这个问题的方法,所有这些都是一些改动而不仅仅是一个直接的copy-item命令。在PS 3.0之前给出一些这些问题,所以答案没有错,但是使用powershell 3.0我终于能够使用-Co​​ntainer开关来实现这一点。

Copy-Item $from $to -Recurse -Container

这是我运行的测试,没有错误,目标文件夹代表相同的文件夹结构。

New-Item -ItemType dir -Name test_copy
New-Item -ItemType dir -Name test_copy\folder1
New-Item -ItemType file -Name test_copy\folder1\test.txt
#NOTE: with no \ at the end of the destination the file is created in the root of the destination, does not create the folder1 container
#Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2 -Recurse -Container

#if the destination does not exists this created the matching folder structure and file with no errors
Copy-Item D:\tmp\test_copy\* D:\tmp\test_copy2\ -Recurse -Container

答案 2 :(得分:1)

我在Windows 7的单个文件夹中有文件,我想重命名并复制到不存在的文件夹。

我使用了以下PowerShell脚本,该脚本将Copy-New-Item函数定义为Test-ItemNew-ItemCopy-Item cmdlet的包装器:

function Copy-New-Item {
  $SourceFilePath = $args[0]
  $DestinationFilePath = $args[1]

  If (-not (Test-Path $DestinationFilePath)) {
    New-Item -ItemType File -Path $DestinationFilePath -Force
  } 
  Copy-Item -Path $SourceFilePath -Destination $DestinationFilePath
}

Copy-New-Item schema_mml3_mathml3_rnc schema\mml3\mathml3.rnc
# More of the same...
Copy-New-Item schema_svg11_svg_animation_rnc schema\svg11\svg-animation.rnc
# More of the same...
Copy-New-Item schema_html5_assertions_sch schema\html5\assertions.sch
# More of the same...

(请注意,在这种情况下,源文件名没有文件扩展名。)

如果目标文件路径不存在,则该函数在该路径中创建一个空文件,强制在文件路径中创建任何不存在的目录。 (如果Copy-Item可以自行完成所有这些操作,我无法从documentation看到如何执行此操作。)

答案 3 :(得分:1)

这是一个做到这一点的人。 Split-Path检索父文件夹,New-Item创建它,然后Copy-Item复制该文件。请注意,目标文件将具有与源文件相同的文件名。另外,如果您需要将多个文件复制到同一个文件夹中(与第二个文件一样),则会出现An item with the specified name <destination direcory name> already exists错误。

Copy-Item $source -Destination (New-Item -Path (Split-Path -Path $destination) -Type Directory)

答案 4 :(得分:0)

当前的答案都无法解决Could not find a part of the path引发的Copy-Item错误。经过一些研究和测试,我发现如果Destination路径越过260 character Windows path length limit会引发此错误。

我的意思是:如果您提供Destination的{​​{1}}参数的路径,并且要复制的任何文件复制到{{1 }}文件夹中,Copy-Item会引发Destination错误。

解决方法是缩短您的Copy-Item路径,或缩短/展平您要复制的源目录中的文件夹结构。

答案 5 :(得分:0)

很晚了,但是当我偶然发现这个问题以寻找类似问题的解决方案时,我在其他地方找到的最干净的方法是使用 robocopy 而不是 Copy-Item。我需要将整个文件结构与文件一起复制,这很容易通过

实现
robocopy "sourcefolder" "destinationfolder" "file.txt" /s