PowerShell:在文件名中添加日期和时间
PowerShell : add date and time in filename
我制作了一个 powershell 脚本,紧随
$Now = Get-Date
$Days = "1"
$TargetFolder = "D:\DatabaseBackup"
$Extension = "*.bak"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
{
if ($File -ne $NULL)
{
write-host "Deleting File $File" -ForegroundColor "DarkRed"
Remove-Item $File.FullName | out-null
}
else
{
Write-Host "No more files to delete!" -ForegroundColor "Green"
}
}
现在这是一个从目录中删除文件的简单脚本。
我的目录中有这样的文件
adventure_Test-20150131-191938.bak
adventure_Test-20150131-152010.bak
adventure_Test-20150205-191938.bak
adventure_Test-20150205-195038.bak
ontherDatabase-20150205-191938.bak
ontherDatabase-20150205-195038.bak
现在您可以看到我们在 31th Jan 2015
中有两个文件,在 5th Feb 2015
中有两个文件。我想删除除最后添加的两个文件之外的所有文件,我们在文件名中有日期时间以区分
更新
我想为每个数据库备份保留两个最新的文件
您可以使用以下方法:
$bakfiles = Get-ChildItem *.bak
$flist = @()
foreach($backup in $bakfiles) {
if ( $backup.name -match '(\w+)\-(\d{8}\-\d{6})\.bak') {
$dt = [DateTime]::ParseExact($matches[2],"yyyyMMdd-HHmmss",$null)
$o = [PSCustomObject]@{path=$backup.FullName;backupDate=$dt;dbName=$matches[1]}
$flist += ,$o
}
}
$grouped = $flist | Sort-Object -Property BackupDate | Group-Object dbname
foreach($bgroup in $grouped) {
for($i = 0; $i -lt $bgroup.count-2; $i++) {
Remove-Item $bgroup.group[$i].path -WhatIf
}
}
首先我们遍历您目录中的所有 .bak
文件。
我们检查其中的每一个文件名以确保其符合格式,并使用正则表达式提取数据库名称和备份日期。 [DateTime]::ParseExact
可用于创建比较容易比较的日期对象。所有这些属性都存储在 PSCustomObject
中并添加到数组中,因为我们随后可以使用标准 cmdlet 对列表进行筛选、排序和分组。
一旦我们有了对象数组,我们就可以按备份日期排序,并将它们组合在一起。然后我们可以迭代这些组并删除除最后 2 个文件之外的所有文件,因为这些将是该数据库的最后一个文件。
如果您对脚本满意,可以删除 Remove-Item
cmdlet 上的 WhatIf
参数,文件将被删除,而不是显示将被删除的内容。
您的时间戳隐含在文件名中并采用字符串可排序格式,因此您实际上不需要进行任何日期时间操作即可找到最新的时间戳。获取按数据库分组的文件,然后为每个数据库按降序对文件名进行排序,它们将按时间顺序排列,最新的在顶部。
$DBHash = @{}
$Retain = 2
$TargetFolder = "D:\DatabaseBackup"
$Extension = "*.bak"
Get-Childitem $TargetFolder -Include $Extension -Recurse |
Select Name,Fullname |
foreach { $DBHash[$_.Name.Split('-')[0]] += @($_) }
$DBHash.Values |
foreach {
$_ | sort -Descending |
Select -Skip $Retain |
foreach { Remove-Item $_.FullName }
}
我制作了一个 powershell 脚本,紧随
$Now = Get-Date
$Days = "1"
$TargetFolder = "D:\DatabaseBackup"
$Extension = "*.bak"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
{
if ($File -ne $NULL)
{
write-host "Deleting File $File" -ForegroundColor "DarkRed"
Remove-Item $File.FullName | out-null
}
else
{
Write-Host "No more files to delete!" -ForegroundColor "Green"
}
}
现在这是一个从目录中删除文件的简单脚本。
我的目录中有这样的文件
adventure_Test-20150131-191938.bak
adventure_Test-20150131-152010.bak
adventure_Test-20150205-191938.bak
adventure_Test-20150205-195038.bak
ontherDatabase-20150205-191938.bak
ontherDatabase-20150205-195038.bak
现在您可以看到我们在 31th Jan 2015
中有两个文件,在 5th Feb 2015
中有两个文件。我想删除除最后添加的两个文件之外的所有文件,我们在文件名中有日期时间以区分
更新 我想为每个数据库备份保留两个最新的文件
您可以使用以下方法:
$bakfiles = Get-ChildItem *.bak
$flist = @()
foreach($backup in $bakfiles) {
if ( $backup.name -match '(\w+)\-(\d{8}\-\d{6})\.bak') {
$dt = [DateTime]::ParseExact($matches[2],"yyyyMMdd-HHmmss",$null)
$o = [PSCustomObject]@{path=$backup.FullName;backupDate=$dt;dbName=$matches[1]}
$flist += ,$o
}
}
$grouped = $flist | Sort-Object -Property BackupDate | Group-Object dbname
foreach($bgroup in $grouped) {
for($i = 0; $i -lt $bgroup.count-2; $i++) {
Remove-Item $bgroup.group[$i].path -WhatIf
}
}
首先我们遍历您目录中的所有 .bak
文件。
我们检查其中的每一个文件名以确保其符合格式,并使用正则表达式提取数据库名称和备份日期。 [DateTime]::ParseExact
可用于创建比较容易比较的日期对象。所有这些属性都存储在 PSCustomObject
中并添加到数组中,因为我们随后可以使用标准 cmdlet 对列表进行筛选、排序和分组。
一旦我们有了对象数组,我们就可以按备份日期排序,并将它们组合在一起。然后我们可以迭代这些组并删除除最后 2 个文件之外的所有文件,因为这些将是该数据库的最后一个文件。
如果您对脚本满意,可以删除 Remove-Item
cmdlet 上的 WhatIf
参数,文件将被删除,而不是显示将被删除的内容。
您的时间戳隐含在文件名中并采用字符串可排序格式,因此您实际上不需要进行任何日期时间操作即可找到最新的时间戳。获取按数据库分组的文件,然后为每个数据库按降序对文件名进行排序,它们将按时间顺序排列,最新的在顶部。
$DBHash = @{}
$Retain = 2
$TargetFolder = "D:\DatabaseBackup"
$Extension = "*.bak"
Get-Childitem $TargetFolder -Include $Extension -Recurse |
Select Name,Fullname |
foreach { $DBHash[$_.Name.Split('-')[0]] += @($_) }
$DBHash.Values |
foreach {
$_ | sort -Descending |
Select -Skip $Retain |
foreach { Remove-Item $_.FullName }
}