В настоящее время я используюКопировать-элементи интересно, есть ли простая команда, которая будет копировать только файлы, которые не существуют или являются новыми файлами по дате/времени. Искал в интернете, но все, что я вижу, похоже, использует-Что, еслиКоманда. Также, видел-Рекурсияиспользуется. Я тоже не совсем понимаю, что делает эта команда. Есть идеи?
$From = "E:\Folder\*"
$To = "\\Server\Folder"
Copy-Item -Path $From -Destination $To -Verbose
решение1
Опять же, то, что вам нужно, легко осуществить с помощью RoboCopy.exe
, и этот вопрос задавался здесь и на многих других сайтах вопросов и ответов, много раз. Даже здесь, на SU.
А также на 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
Вы можете использовать командлет 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
Из Stack Overflow:
Copy-Item (Join-Path $dir_from "*") $dir_to -Exclude (Get-ChildItem $dir_to)
Связь:Почему Copy-Item
по умолчанию происходит перезапись конечных файлов?