Cómo NO sobrescribir archivos existentes

Cómo NO sobrescribir archivos existentes

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.

Robocopy para copiar solo carpetas y archivos nuevos

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 -WhatIfpara 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:

  1. Compruebe si el archivo existe en la carpeta de destino
  2. Si existe, omita
  3. 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-Itemse sobrescriben los archivos de destino de forma predeterminada?

información relacionada