Должен ли Copy-Item создавать целевую структуру каталогов? - PullRequest
46 голосов
/ 23 сентября 2011

Я пытаюсь скопировать файл в новое место, сохраняя структуру каталогов.

$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'

Ответы [ 4 ]

94 голосов
/ 23 сентября 2011

Опция -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
7 голосов
/ 28 августа 2015

В качестве альтернативы, начиная с PS3.0, вы можете просто использовать New-Item для создания целевой папки напрямую, без необходимости создания «фиктивного» файла, например, ...

New-Item -Type dir \\target\1\2\3\4\5

... с радостью создаст структуру \\ target \ 1 \ 2 \ 3 \ 4 \ 5 независимо от того, сколько ее уже существует.

2 голосов
/ 20 августа 2014

Я копался и нашел много решений этой проблемы, причем все они были не просто прямой командой copy-item, а некоторым изменением. Да, некоторые из этих вопросов предшествуют PS 3.0, чтобы ответы не были неправильными, но с помощью powershell 3.0 я наконец смог выполнить это, используя ключ -Container для copy-item.

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
1 голос
/ 01 марта 2016

У меня были файлы в одной папке в Windows 7, которые я хотел переименовать и скопировать в несуществующие папки.

Я использовал следующий скрипт PowerShell, который определяет функцию Copy-New-Item в качестве оболочки для *Командлеты 1004 *, 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 может сделать все это сам, я не мог понять, как это сделать из документации .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...