Подтвердить что ты не робот

Должен ли 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'
4b9b3361

Ответ 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 или сократить/сгладить структуру папок в исходном каталоге, который вы пытаетесь скопировать.