기존 파일을 덮어쓰지 않는 방법

기존 파일을 덮어쓰지 않는 방법

현재, 나는 사용하고 있습니다복사항목존재하지 않거나 새 파일인 파일만 날짜/시간별로 복사하는 간단한 명령이 있는지 궁금합니다. 온라인에서 찾아봤지만 내가 보는 모든 것은 다음을 사용하는 것 같습니다.-만약명령. 또한 본-재귀사용되고 있습니다. 나는 그 명령이 무엇을 하는지 완전히 이해하지 못합니다. 어떤 아이디어가 있나요?

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

답변1

다시 말하지만, 당신이 원하는 것은 를 사용하여 쉽게 달성할 수 RoboCopy.exe있으며 이 질문은 여기와 다른 많은 Q&A 사이트에서 여러 번 요청되었습니다. 여기 SU에서도요.

새 폴더와 파일만 복사하는 Robocopy

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을 사용할 수 있습니다. 스크립트에는 기본적으로 다음 흐름이 있어야 합니다.

  1. 대상 폴더에 파일이 있는지 확인하십시오.
  2. 존재하는 경우 건너뜁니다.
  3. 존재하지 않는 경우 복사하십시오.

내 컴퓨터에서 매우 조잡하고 간단한 테스트를 실행했는데 제대로 작동할 것입니다(사용 사례에 맞게 수정하는 것을 기억하세요).

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

링크:Copy-Item기본적으로 대상 파일을 덮어쓰는 이유는 무엇입니까 ?

관련 정보