首页 > 解决方案 > 如何使用脚本查找最新的完整文件和增量文件

问题描述

我们在多台机器上使用 Veeam Agent for Windows,这些机器通常会生成包含以下内容的文件夹:

2021-01-16  11:14 PM    69,181,009,920 DEV82021-01-16T230042.vbk
2021-01-17  11:02 PM     2,516,852,736 DEV82021-01-17T230037.vib
2021-01-18  11:03 PM     4,966,821,888 DEV82021-01-18T230106.vib
2021-01-19  11:02 PM     4,096,479,232 DEV82021-01-19T230103.vib
2021-01-20  11:02 PM     4,885,250,048 DEV82021-01-20T230103.vib
2021-01-21  11:02 PM     4,519,645,184 DEV82021-01-21T230037.vib
2021-01-22  11:02 PM     5,085,712,384 DEV82021-01-22T230037.vib
2021-01-23  11:17 PM    70,159,249,408 DEV82021-01-23T230038.vbk
2021-01-24  11:02 PM     3,897,864,192 DEV82021-01-24T230026.vib
2021-01-25  11:02 PM     6,467,932,160 DEV82021-01-25T230027.vib
2021-01-26  11:02 PM     5,735,276,544 DEV82021-01-26T230031.vib
2021-01-28  07:42 AM     6,019,416,064 DEV82021-01-28T074032.vib

我需要的是能够捕获最新的 .vbk 文件(完整备份)及其所有相关的 *.vib 文件(增量备份)。该脚本将每天运行,因此如果最新的 .vbk 与之前的运行相比没有变化,则跳过上传它及其相关的 .vib 文件,仅上传新的 .vib 文件,直到创建新的 .vbk。7 天后,将创建一个新的 .vbk 文件,因此我们应该上传此文件和任何相关的 .vib 文件。

使用上面的示例应该上传以下文件(我们使用 gsutil):

2021-01-23  11:17 PM    70,159,249,408 DEV82021-01-23T230038.vbk
2021-01-24  11:02 PM     3,897,864,192 DEV82021-01-24T230026.vib
2021-01-25  11:02 PM     6,467,932,160 DEV82021-01-25T230027.vib
2021-01-26  11:02 PM     5,735,276,544 DEV82021-01-26T230031.vib
2021-01-28  07:42 AM     6,019,416,064 DEV82021-01-28T074032.vib

第二天脚本再次运行时,检查是否有新的或更改的 .vbk 或 .vib 文件并使用 gsutil 上传它们。7 天后,删除所有旧的 .vbk 文件及其相关的 .vib 文件,只留下最新的 .vbk 文件及其最新的相关 .vib 文件。

如何使用 Windows 批处理脚本或 powershell 脚本将这些文件名捕获到某个变量中,然后处理变量中的每个文件并使用 gsutil 上传它,例如:

gsutil cp -n -r "\192.168.2.251\Backups%COMPUTERNAME%" gs://%Bucket%/"%COMPUTERNAME%"

现在我有这样的事情:

for /f "skip=1" %%i in ('dir "\\192.168.2.251\Backups\%COMPUTERNAME%" /b /o-d') do (set newestvbk=%%i)

但这只会给我最新的 .vbk (DEV82021-01-23T230038.vbk)。我还需要它的相关 .vib 文件:

DEV82021-01-24T230026.vib DEV82021-01-25T230027.vib DEV82021-01-26T230031.vib DEV82021-01-28T074032.vib

如何捕获最新的 vbk 文件和之后创建的所有 .vib 文件?

标签: powershellbatch-file

解决方案


for /f %%i in ('dir "\\192.168.2.251\Backups\%COMPUTERNAME%" /b /a-d /o-d') do (
 if /i "%%~xi"==".vib" echo backup %%i
 if /i "%%~xi"==".vbk" echo backup %%i&goto done
)
:done

备份每个vib文件直到vbk找到a

[根据评论进行修订 - 删除旧的 .vib、.vbk]

set "keepme=Y"
for /f %%i in ('dir "\\192.168.2.251\Backups\%COMPUTERNAME%" /b /a-d /o-d') do (
 if /i "%%~xi"==".vib" if defined keepme (echo backup %%i) else (echo del %%i)
 if /i "%%~xi"==".vbk" if defined keepme (echo backup %%i&set "keepme=") else (echo del %%i)
)

用于if defined解释名为keepme. 在循环之前,keepme定义了(实际值无关紧要)。.vib.vbk文件像以前一样处理,但在备份第一个文件后.vbk设置为keepme空,使其未定义,因此删除了所选扩展名的其他文件。


推荐阅读