Должен ли Copy-Item создать структуру каталога назначения?
Я пытаюсь скопировать файл в новое место, поддерживая структуру каталогов.
$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'
Ответы
Ответ 1
Параметр -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
Ответ 2
В качестве альтернативы, с PS3.0 и далее, вы можете просто использовать New-Item для создания целевой папки напрямую, без необходимости создания файла "dummy", например....
New-Item -Type dir \\target\1\2\3\4\5
... с радостью создаст структуру \\target\1\2\3\4\5 независимо от того, сколько ее уже существует.
Ответ 3
Я копался и нашел много решений для этой проблемы, и все это были некоторые изменения, а не просто команда с прямым копированием. Предоставьте ему некоторые из этих вопросов, предшествующих 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
Ответ 4
У меня были файлы в одной папке в Windows 7, которые я хотел переименовать и скопировать в несуществующие папки.
Я использовал следующий PowerShell script, который определяет функцию Copy-New-Item
как оболочку для командлетов Test-Item
, New-Item
и Copy-Item
:
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
может сделать все это сам по себе, я не мог понять, как это сделать из документации.)
Ответ 5
Ни один из текущих ответов не помог мне исправить ошибку Could not find a part of the path
, возникшую в Copy-Item
. После некоторых исследований и испытаний я обнаружил, что эта ошибка может возникать, если путь Destination
превышает ограничение длины пути Windows в 260 символов.
Под этим я подразумеваю следующее: если вы укажете путь к аргументу Destination
в Copy-Item
, а любой из копируемых вами файлов превысит ограничение в 260 символов при копировании в папку Destination
, Copy-Item
вызовет повышение ошибка Could not find a part of the path
.
Исправление состоит в том, чтобы сократить путь Destination
или сократить/сгладить структуру папок в исходном каталоге, который вы пытаетесь скопировать.