2010-04-23 6 views

ответ

61

Да, добавьте параметр -Force.

copy-item $from $to -Recurse -Force 
+2

PowerShell настолько легко, когда один знает :) – stej

+57

это работает для целых каталогов, но что, если я просто копирование отдельных файлов (так что я могу иметь ул на нас)? Как скопировать файл c: \ test1 \ file.txt в c: \ test2 \ file.txt, когда c: \ test2 не существует? Это то, что мне действительно нужно знать, как это сделать. Спасибо, Gary –

+30

Я столкнулся с этой проблемой и решил ее, сначала позвонив по New-Item: 'New-Item -Force $ to' ' Copy-Item -Force $ from $ to' – rjschnorenberg

75

В PowerShell 2.0, он по-прежнему не удается получить Copy-Item используется для создания папки назначения, вы будете нуждаться в такой код:

$destinationFolder = "C:\My Stuff\Subdir" 

if (!(Test-Path -path $destinationFolder)) {New-Item $destinationFolder -Type Directory} 
Copy-Item "\\server1\Upgrade.exe" -Destination $destinationFolder 

Если вы используете -recurse в Копировать-элемент, он создаст все вложенные папки исходной структуры в месте назначения, но не создаст фактическую папку назначения, даже с -Force.

+0

Спасибо за это наблюдение. Я получил некоторые непоследовательные действия копирования; иногда он копировал подпапку, а иногда - нет. Убедившись, что папка назначения существует, эта несогласованность исчезла. –

+0

Я также сталкиваюсь с неправильным поведением, когда целевая папка не существует – vicancy

7

В PowerShell 3 и выше я использую Copy-Item with New-Item.

copy-item -Path $file -Destination (new-item -type directory -force ("C:\Folder\sub\sub\" + $newSub)) -force -ea 0 

Я не пробовал его в вер 2.

+0

Это отлично работает для локальной копии! Не при использовании команды '-ToSession': '( – Hicsy

0

я наткнулась здесь дважды, и это последний раз, когда была уникальная ситуация, и даже если я канаву с помощью copy-item я хотел опубликовать решение я использовал ,

Имел список только файлов с полным путем, и в большинстве случаев файлы не имеют расширений. опция -Recurse -Force не сработает для меня, поэтому я сбросил функцию copy-item и вернулся к чему-то вроде ниже, используя xcopy, поскольку я все еще хотел сохранить его одним лайнером. Первоначально я был связан с Robocopy, но он, по-видимому, ищет расширение файла, и поскольку многие из моих не имели расширения, он считал его каталогом.

$filelist = @("C:\Somepath\test\location\here\file","C:\Somepath\test\location\here2\file2") 

$filelist | % { echo f | xcopy $_ $($_.Replace("somepath", "somepath_NEW")) } 

Надеюсь, это поможет кому-то.

0
$filelist | % { 
    $file = $_ 
    mkdir -force (Split-Path $dest) | Out-Null 
    cp $file $dest 
    } 
2

Мое любимое - использовать класс .Net [IO.DirectoryInfo], который позаботится о некоторой логике. Я действительно использую это для множества подобных задач сценариев. Он имеет метод .Create(), который создает каталоги, которые не существуют, без ошибок, если они это делают.

Поскольку это еще проблема с двумя шагами, я использую псевдоним foreach, чтобы сохранить его простым. Для отдельных файлов:

[IO.DirectoryInfo]$to |% {$_.create(); cp $from $_} 

Насколько многостраничный матча файла/каталога, я хотел бы использовать RoboCopy над хсором. Удалите «*» из вашего от и просто использовать:

RoboCopy.exe $from $to * 

Вы все еще можете добавить/г (Recurse),/е (Recurse включая порожние), и 50 других полезных переключателей.

Редактировать: Оглядываясь на это, оно является кратким, но не очень читаемым, если вы часто не используете код.Обычно у меня есть она разделилась на две части, например, так:

([IO.DirectoryInfo]$to).Create() 
cp $from $to 

Кроме того, DirectoryInfo является тип материнской собственности FileInfo, так что если вы $ в это файл, вы можете использовать их вместе:

([IO.FileInfo]$to).Parent.Create() 
cp $from $to 
2
function Copy-File ([System.String] $sourceFile, [System.String] $destinationFile, [Switch] $overWrite) { 

    if ($sourceFile -notlike "filesystem::*") { 
     $sourceFile = "filesystem::$sourceFile" 
    } 

    if ($destinationFile -notlike "filesystem::*") { 
     $destinationFile = "filesystem::$destinationFile" 
    } 

    $destinationFolder = $destinationFile.Replace($destinationFile.Split("\")[-1],"") 

    if (!(Test-Path -path $destinationFolder)) { 
     New-Item $destinationFolder -Type Directory 
    } 

    try { 
     Copy-Item -Path $sourceFile -Destination $destinationFile -Recurse -Force 
     Return $true 
    } catch [System.IO.IOException] { 
     # If overwrite enabled, then delete the item from the destination, and try again: 
     if ($overWrite) { 
      try { 
       Remove-Item -Path $destinationFile -Recurse -Force   
       Copy-Item -Path $sourceFile -Destination $destinationFile -Recurse -Force 
       Return $true 
      } catch { 
       Write-Error -Message "[Copy-File] Overwrite error occurred!`n$_" -ErrorAction SilentlyContinue 
       #$PSCmdlet.WriteError($Global:Error[0]) 
       Return $false 
      } 
     } else { 
      Write-Error -Message "[Copy-File] File already exists!" -ErrorAction SilentlyContinue 
      #$PSCmdlet.WriteError($Global:Error[0]) 
      Return $false 
     } 
    } catch { 
     Write-Error -Message "[Copy-File] File move failed!`n$_" -ErrorAction SilentlyContinue 
     #$PSCmdlet.WriteError($Global:Error[0]) 
     Return $false 
    } 
} 
+0

Добро пожаловать в Stack Overflow! Спасибо за этот фрагмент кода, который может оказать немедленную помощь. Правильное объяснение [значительно улучшилось] (// meta.stackexchange.com/q/114762) его образовательная ценность, показав * почему * это хорошее решение проблемы и сделало бы ее более полезной для будущих читателей с похожими, но не идентичными вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснения, и дайте указание того, какие ограничения и допущения применяются. –

Смежные вопросы