目前,我正在使用複製專案並想知道是否有一個簡單的命令只能按日期/時間複製不存在的文件或新文件。在網上查看過,但我看到的所有內容似乎都在使用-如果什麼命令。還看到了-遞迴正在使用。我也不完全明白該命令的作用。有任何想法嗎?
$From = "E:\Folder\*"
$To = "\\Server\Folder"
Copy-Item -Path $From -Destination $To -Verbose
答案1
同樣,您所追求的內容可以通過 輕鬆完成RoboCopy.exe
,並且這個問題已在此處和許多其他問答網站上多次提出。即使在蘇這裡。
以及SO
https://stackoverflow.com/questions/23303532/use-robocopy-to-copy-only-changed-files
RC will only copy newer files. Files of the same age will be skipped.
C:\SourceFolder D:\DestinationFolder ABC.dll /XO
robocopy c:\users\valery\documents j:\robocopy /XO /E /MAXAGE:20131030 /XD
# Result: A full folders tree is created. Only new files copied.
所以,你的問題其實是上述問題的重複。
否則,您最終必須了解並執行以下操作(如果您是新手,正如您所說,在單一搜尋或一組搜尋中找到它並不容易):
Clear-Host
$Source = 'D:\Temp\Source'
$Destination = 'D:\Temp\Destination'
Get-ChildItem -Path $Source -Recurse |
ForEach-Object {
If (Test-Path -Path "$Destination\$($PSItem.Name)")
{
Write-Warning -Message "`n$($PSItem.Name) already exists in $Destination. Checking timestamp`n"
Try
{
"Copying file if $($PSItem.Name) is newer"
Get-ChildItem -Path $Destination -Filter $PSItem.Name |
Where-Object LastWriteTime -lt $PSItem.LastWriteTime -ErrorAction Stop
Copy-Item -Path $PSItem.FullName -Destination $Destination -Verbose -WhatIf
}
Catch {$PSItem.Exception.Message}
}
Else
{
Write-Host "`n$PSItem.Name does not Exist in $Destination`n" -ForegroundColor Cyan
Copy-Item -Path $PSItem.FullName -Destination $Destination -Verbose -WhatIf
}
}
# Results
<#
...
WARNING:
abc.txt already exists in D:\Temp\Destination. Checking timestamp
...
WARNING:
LexPointOh.txt already exists in D:\Temp\Destination. Checking timestamp
Copying file if $($PSItem.Name) is newer
-a---- 10-Apr-21 00:00 0 LexPointOh.txt
What if: Performing the operation
"Copy File" on target "Item: D:\Temp\Source\LexPointOh.txt
Destination: D:\Temp\Destination\LexPointOh.txt".
mytest - Copy.txt.Name does not Exist in D:\Temp\Destination
What if: Performing the operation "Copy File" on target
"Item: D:\Temp\Source\mytest - Copy.txt
Destination: D:\Temp\Destination\mytest - Copy.txt".
...
#>
只需刪除它-WhatIf
即可執行操作。
所以,根據你的說法:
我也不完全明白該命令的作用。
既然如此;那麼,我上面展示的將是更大的挑戰。因此,我在原始的帖子中向您指出了幫助文件(培訓網站、Youtube 等)。
以上只是實現此目的的一種方法。 PowerShell 提供了多種方法來完成 X 或 Y 件事。例如,這是執行相同用例的另一種方法。
Clear-Host
$Source = ($SourceFiles = Get-ChildItem -Path 'D:\Temp\Source')[0].DirectoryName
$Destination = ($DestinationFiles = Get-ChildItem -Path 'D:\Temp\Destination')[0].DirectoryName
Compare-Object -ReferenceObject $SourceFiles -DifferenceObject $DestinationFiles -IncludeEqual |
ForEach-Object {
If ($PSItem.SideIndicator -match '==|=>')
{
If (
Get-ChildItem -Path $Destination -Filter $($PSItem.InputObject.Name) |
Where-Object LastWriteTime -LT $PSItem.InputObject.LastWriteTime
)
{
Write-Warning -Message "`n$($PSItem.InputObject) already exists in $Destination. Checking timestamp`n"
Copy-Item -Path $PSItem.InputObject.FullName -Destination $Destination -ErrorAction SilentlyContinue -Verbose -WhatIf
}
}
Else
{
Write-Host "`n$($PSItem.InputObject ) does not Exist in $Destination`n" -ForegroundColor Cyan
Copy-Item -Path $PSItem.InputObject.FullName -Destination $Destination -Verbose -WhatIf
}
}
# Results
<#
WARNING:
abc.txt already exists in D:\Temp\Destination. Checking timestamp
What if: Performing the operation "Copy File" on target "Item: D:\Temp\Source\abc.txt Destination: D:\Temp\Destination\abc.txt".
WARNING:
LexPointOh.txt already exists in D:\Temp\Destination. Checking timestamp
What if: Performing the operation "Copy File" on target "Item: D:\Temp\Source\LexPointOh.txt Destination: D:\Temp\Destination\LexPointOh.txt".
mytest - Copy.txt does not Exist in D:\Temp\Destination
What if: Performing the operation "Copy File" on target "Item: D:\Temp\Source\mytest - Copy.txt Destination: D:\Temp\Destination\mytest - Copy.txt".
...
#>
然而,在大多數情況下,任何時候您使用比較邏輯時,您都不會看到簡單的命令。
因此,請使用適合工作的正確工具。除非這是一項家庭作業,否則不要增加你的核心工作量/不要重新發明輪子。
答案2
您可以使用 cmdlet Get-ChildItem。您的腳本基本上應該有以下流程:
- 檢查目標資料夾中是否存在該文件
- 如果存在則跳過
- 如果不存在則複製
我在我的計算機上運行了一個非常粗略和簡單的測試,這應該可以工作(記住將其修改為您的用例)
$FROM = "T:\Files\Scripts1\BackItUp.ps1"
$TO = "T:\Files2"
if (Get-ChildItem -Path $TO "BackItUp.ps1") {
Write-Host "file already exists..skipping"
} else {
Copy-Item $FROM -Destination $TO
}
答案3
來自堆疊溢位:
Copy-Item (Join-Path $dir_from "*") $dir_to -Exclude (Get-ChildItem $dir_to)