2010-04-23 98 views

回答

61

是的,請添加-Force參數。

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

PowerShell是那麼容易當一個人知道它:) – stej 2010-04-23 08:41:56

+57

,對於整個目錄的工作,但如果我只是複製單個文件(這樣我就可以有一個ST的ATU)?當c:\ test2不存在時,如何將c:\ test1 \ file.txt複製到c:\ test2 \ file.txt中?這是我真正需要知道如何去做的。謝謝, Gary – 2010-12-16 16:46:30

+30

我遇到了同樣的問題,並通過調用New-Item first來解決: 'New-Item -Force $ to' 'Copy-Item -Force $ from $ to' – rjschnorenberg 2012-04-26 19:52:44

75

在PowerShell 2.0中,它仍然不可能得到複製,項目cmdlet創建目標文件夾,你需要這樣的代碼:如果您在使用-Recurse

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

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

Copy-Item將創建目標源結構的所有子文件夾,但它不會創建實際的目標文件夾,即使使用-Force也是如此。

+0

感謝您的觀察。我有一些不一致的複製行爲;有時它複製了一個子文件夾,有時它沒有。確保目標文件夾存在後,這種不一致性消失了。 – 2016-11-29 07:31:51

+0

當目標文件夾不存在時,我也會遇到錯誤的行爲 – vicancy 2017-04-26 01:39:38

7

在PowerShell 3及以上版本中,我使用Copy-Item和New-Item。

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

我還沒有在版本2

+0

這對於本地複製非常有用,謝謝!不是當使用'-ToSession'命令時:'( – Hicsy 2017-12-08 03:28:49

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 $_} 

至於你的多文件/目錄相匹配,我會通過xcopy使用RoboCopy。從「*」從刪除,只是使用:

RoboCopy.exe $from $to * 

您仍可以添加/ R(遞歸),/ E(遞歸包括空),並有50個其他有用的交換機。

編輯:回想一下,這是簡潔的,但不是很可讀,如果你不經常使用的代碼。通常我把它一分爲二,就像這樣:

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

此外,DirectoryInfo的的FileInfo的Parent屬性的類型,因此,如果您$到是一個文件,你可以使用它們一起:

([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

歡迎來到堆棧溢出!感謝您的代碼片段,它可能會提供一些即時幫助。一個正確的解釋[會大大提高](// meta.stackexchange.com/q/114762)通過展示*爲什麼*這是一個很好的解決方案,它將使它對未來的讀者提供類似的,但不完全相同的問題更有用,請爲你的答案添加解釋,表明適用的是什麼限制和假設。 – 2017-06-02 08:33:13

相關問題