Actualmente estoy usandoCopiar elementoy me pregunto si hay un comando simple que solo copiará archivos que no existen o que sean archivos nuevos por fecha/hora. Busqué en línea pero todo lo que veo parece estar usando-Y sidominio. Además, visto-recursesiendo utilizado. Tampoco entiendo completamente qué hace ese comando. ¿Algunas ideas?
$From = "E:\Folder\*"
$To = "\\Server\Folder"
Copy-Item -Path $From -Destination $To -Verbose
Respuesta1
Nuevamente, lo que busca se logra fácilmente con RoboCopy.exe
, y esta pregunta se ha formulado aquí y en muchos otros sitios de preguntas y respuestas, varias veces. Incluso aquí en SU.
Así como en 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.
Entonces, tu pregunta es en realidad un duplicado de la anterior.
De lo contrario, terminarás teniendo que saber y hacer cosas como las siguientes (y si eres nuevo, como dices, no es fácil de encontrar en una sola búsqueda o en un conjunto de búsquedas):
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".
...
#>
Simplemente retire el -WhatIf
para que haga cosas.
Entonces, según su declaración:
Tampoco entiendo completamente qué hace ese comando.
Siendo ese el caso; Entonces, lo que muestro arriba sería un desafío mayor. Por eso te señalé los archivos de ayuda (sitio de capacitación, Youtube, etc.) en mi publicación original.
Lo anterior es sólo una forma de hacer esto. PowerShell proporciona varias formas de hacer X o Y cosas. Por ejemplo, aquí hay otra forma de hacer el mismo caso de uso.
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".
...
#>
Sin embargo, cada vez que utiliza la lógica comparativa, en la mayoría de los casos no está mirando un comando simple.
Por lo tanto, utilice la herramienta adecuada para el trabajo. A menos que se trate de una tarea, no aumente su carga de trabajo principal/No reinvente la rueda.
Respuesta2
Puede utilizar el cmdlet Get-ChildItem. Su script básicamente debería tener este flujo:
- Compruebe si el archivo existe en la carpeta de destino
- Si existe, omita
- Si no existe, copie
Ejecuté una prueba muy cruda y simple en mi computadora y esto debería funcionar (recuerde modificarla según su caso de uso)
$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
}
Respuesta3
Desde el desbordamiento de pila:
Copy-Item (Join-Path $dir_from "*") $dir_to -Exclude (Get-ChildItem $dir_to)
Enlace:¿Por qué Copy-Item
se sobrescriben los archivos de destino de forma predeterminada?