Powershell 中的备份文件夹

问题描述

我正在编写一个脚本来创建每日备份(任务计划)

首先,我复制文件夹“source_folder”并重命名“bkp”文件夹内所有带有时间戳的文件,当“source_folder”中添加文件时,只需要复制最后一个文件重命名(我尝试使用 LastModified或 LastAccesstime 但是当我再次运行脚本时(第二天),如果在 soruce_folder 中没有创建其他文件,则复制最后一个文件 有什么建议吗?

$sourceFiles = Get-ChildItem -Path $source -Recurse
$bkpFiles    = Get-ChildItem -Path $bkp -Recurse
$syncMode    = 1 

if(!(Test-Path $bkp)) {
   copy-Item -Path $source -Destination $bkp -Force -Recurse
   Write-Host "created new folder"  
   $files = get-ChildItem -File -Recurse -Path $bkp
   foreach($file in $files){
       # copy  files to the backup directory
       $newfilename = $file.FullName +"_"+ (Get-Date -Format yyyy-MM-dd-hhmmss)
   
       Rename-Item -path $file.FullName -NewName $newfilename
   }
}
elseif ((Test-Path $bkp ) -eq 1) {
    $timestamp1 = (Get-Date -Format yyyy-MM-dd-hhmmss)
    $timestamp = "_" + $timestamp1
    @(Get-ChildItem $source -Filter *.*| Sort LastAccesstime -Descending)[0] | % { 
        copy-Item -path $_.FullName -destination $("$bkp\$_$timestamp") -force
    }  
    Write-Host  "most recent files added" 
}

解决方法

基于此“(Get-ChildItem $source -Filter .| Sort LastAccessTime -Descending)[0]”,您只希望每天复制 1 个文件。听起来问题在于,即使没有将新文件添加到 $source,脚本也会复制文件。希望我有这个权利。

也许您可以添加如下过滤器,假设您的文件是定期添加的

(Get-ChildItem $source -Filter .| Sort LastAccessTime -Descending | ? {$_.LastAccessTime -gt $(get-date).AddDays(-1))[0] #可能想使用 LastWriteTime 或 CreationTime 代替 LastAccessTime。还可以摆弄 .AddDays - .AddMinutes、.AddHours 等。

或者,您可以在复制之前检查 $bkp 文件夹以查看该文件是否存在:

@(Get-ChildItem $source -Filter *.*| Sort LastAccessTime -Descending)[0] | % { 
#check if file exists in $bkp before copying from $source
#"$($_.name)*" part tries to account for the file in $bkp having a timestamp appended to the name
$x = get-childitem $bkp -recurse | ? {$_.name -like "$($_.name)*"}
if(!$x){
    Copy-Item -path $_.FullName -destination $("$bkp\$_$timestamp") -force
}        

}