$from = "\\something\1 XLS\2010_04_22\*"
$to = "c:\out\1 XLS\2010_04_22\"
copy-item $from $to -Recurse
如果c:\ out \ 1 XLS \ 2010_04_22 \確實存在,如果不存在,是否可以使用單個命令創建「c:\ out \ 1 XLS \ 2010_04_22 \」。Powershell 2複製項目,它創建一個文件夾如果不存在
$from = "\\something\1 XLS\2010_04_22\*"
$to = "c:\out\1 XLS\2010_04_22\"
copy-item $from $to -Recurse
如果c:\ out \ 1 XLS \ 2010_04_22 \確實存在,如果不存在,是否可以使用單個命令創建「c:\ out \ 1 XLS \ 2010_04_22 \」。Powershell 2複製項目,它創建一個文件夾如果不存在
是的,請添加-Force
參數。
copy-item $from $to -Recurse -Force
在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也是如此。
感謝您的觀察。我有一些不一致的複製行爲;有時它複製了一個子文件夾,有時它沒有。確保目標文件夾存在後,這種不一致性消失了。 – 2016-11-29 07:31:51
當目標文件夾不存在時,我也會遇到錯誤的行爲 – vicancy 2017-04-26 01:39:38
在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
這對於本地複製非常有用,謝謝!不是當使用'-ToSession'命令時:'( – Hicsy 2017-12-08 03:28:49
我已經在這裏兩次絆倒了,這一次是一個獨特的情況,即使我用溝裏我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")) }
希望它有助於某人。
$filelist | % {
$file = $_
mkdir -force (Split-Path $dest) | Out-Null
cp $file $dest
}
我最喜歡使用.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
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
}
}
歡迎來到堆棧溢出!感謝您的代碼片段,它可能會提供一些即時幫助。一個正確的解釋[會大大提高](// meta.stackexchange.com/q/114762)通過展示*爲什麼*這是一個很好的解決方案,它將使它對未來的讀者提供類似的,但不完全相同的問題更有用,請爲你的答案添加解釋,表明適用的是什麼限制和假設。 – 2017-06-02 08:33:13
PowerShell是那麼容易當一個人知道它:) – stej 2010-04-23 08:41:56
,對於整個目錄的工作,但如果我只是複製單個文件(這樣我就可以有一個ST的ATU)?當c:\ test2不存在時,如何將c:\ test1 \ file.txt複製到c:\ test2 \ file.txt中?這是我真正需要知道如何去做的。謝謝, Gary – 2010-12-16 16:46:30
我遇到了同樣的問題,並通過調用New-Item first來解決: 'New-Item -Force $ to' 'Copy-Item -Force $ from $ to' – rjschnorenberg 2012-04-26 19:52:44