我正在尝试将文件复制到新位置,维护目录结构。
$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'
答案 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我终于能够使用-Container开关来实现这一点。
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-Item
,New-Item
和Copy-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