So überschreiben Sie vorhandene Dateien NICHT

So überschreiben Sie vorhandene Dateien NICHT

Derzeit verwende ichKopiere Artikelund frage mich, ob es einen einfachen Befehl gibt, der nur Dateien kopiert, die nicht existieren oder neue Dateien nach Datum/Uhrzeit sind. Habe online nachgesehen, aber alles, was ich sehe, scheint zu verwenden-Was ist, wennBefehl. Auch gesehen-Rekursverwendet wird. Ich verstehe auch nicht ganz, was dieser Befehl macht. Irgendwelche Ideen?

$From = "E:\Folder\*"
$To = "\\Server\Folder"
Copy-Item -Path $From -Destination $To -Verbose

Antwort1

Auch hier können Sie Ihr Ziel problemlos mit erreichen. RoboCopy.exeDiese Frage wurde hier und auf vielen anderen Q&A-Sites mehrfach gestellt, sogar hier auf SU.

Robocopy zum Kopieren nur neuer Ordner und Dateien

Sowie auf 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.

Ihre Frage ist also eigentlich eine Kopie der obigen Frage.

Andernfalls müssen Sie Dinge wie die folgenden wissen und tun (und wenn Sie neu sind, ist es, wie Sie sagen, nicht einfach, dies mit einer einzigen Suche oder einer Reihe von Suchvorgängen zu finden):

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".
...
#>

Entfernen Sie einfach das, -WhatIfdamit es funktioniert.

Basierend auf Ihrer Aussage gilt also:

Ich verstehe auch nicht ganz, was dieser Befehl bewirkt.

Wenn das der Fall ist, wäre das, was ich oben zeige, eine größere Herausforderung. Deshalb habe ich Sie in meinem ursprünglichen Beitrag auf die Hilfedateien (Schulungsseite, YouTube usw.) verwiesen.

Das Obige ist nur eine Möglichkeit, dies zu tun. PowerShell bietet verschiedene Möglichkeiten, um X oder Y Dinge zu tun. Hier ist beispielsweise eine andere Möglichkeit, denselben Anwendungsfall durchzuführen.

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".

...
#>

Wenn Sie jedoch vergleichende Logik verwenden, betrachten Sie in den meisten Fällen keinen einfachen Befehl.

Verwenden Sie also das richtige Werkzeug für die jeweilige Aufgabe. Sofern es sich nicht um eine Hausaufgabe handelt, erhöhen Sie Ihr Arbeitspensum nicht. Erfinden Sie das Rad nicht neu.

Antwort2

Sie können das Cmdlet Get-ChildItem verwenden. Ihr Skript sollte im Wesentlichen diesen Ablauf haben:

  1. Überprüfen Sie, ob die Datei im Zielordner vorhanden ist
  2. Wenn vorhanden, dann überspringen
  3. Wenn nicht vorhanden, dann kopieren

Ich habe einen sehr groben und einfachen Test auf meinem Computer ausgeführt und dieser sollte funktionieren (denken Sie daran, ihn an Ihren Anwendungsfall anzupassen).

$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
}

Antwort3

Von Stack Overflow:

Copy-Item (Join-Path $dir_from "*") $dir_to -Exclude (Get-ChildItem $dir_to)

Verknüpfung:Warum werden Copy-ItemZieldateien standardmäßig überschrieben?

verwandte Informationen