问题描述
我正在编写一个脚本来创建每日备份(任务计划)
首先,我复制文件夹“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
}
}