powershell脚本根据文件名的开头删除文件
powershell script to delete files based on start of file name
所以我的文件夹中有以
开头的文件
1__
和
0__
示例文件
1__shal1absahal9182skab.php
0__abns1a3bshal54a4m5sb.php
我正在尝试让我的 powershell 脚本仅删除 1__
中早于 60 mins
的文件,而 0__
可以每隔 360 mins
删除一次。
这是我当前的代码
$limit = (Get-Date).AddMinutes(-360)
$path = "C:\cache"
# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
我的脚本目前将这两个文件视为相同的文件,并在 360 minute
节拍时删除它们。
找到了使用 if 和 else 以及一些正则表达式模式匹配的解决方案。
$limit_guest = (Get-Date).AddMinutes(-360) #6 hours
$limit_logged_in = (Get-Date).AddMinutes(-60) #1 hours
$path = "C:\cache"
# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { if ( $_ -match "^0__.*" ) { !$_.PSIsContainer -and $_.CreationTime -lt $limit_guest } else { !$_.PSIsContainer -and $_.CreationTime -lt $limit_logged_in } } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
可以精简如下:
使用-File
和-Directory
限制Get-ChildItem
只输出该类型的项目。
将 -Include
与 PowerShell wildcard expression 结合使用可将匹配限制为名称以 0__
或 1__
.
开头的文件
$now = Get-Date
$limit_guest = $now.AddMinutes(-360) #6 hours
$limit_logged_in = $now.AddMinutes(-60) #1 hour
# Delete files older than the $limit.
Get-ChildItem -File -Path $path -Recurse -Force -Include '[01]__*' |
Where-Object {
$_.CreationTime -lt ($limit_guest, $limit_logged_in)[$_.Name -like '1__*']
} | Remove-Item -Force -WhatIf
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Directory -Path $path -Recurse -Force |
Where-Object {
(Get-ChildItem -File -LiteralPath $_.FullName -Recurse -Force).Count -eq 0
} | Remove-Item -Force -Recurse -WhatIf
注意:上面命令中的-WhatIf
common parameter预览操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf
。
注:
($limit_guest, $limit_logged_in)[$_.Name -like '1__*']
通过根据条件 $_.Name -like '1__*'
选择 $limit_*
值之一来模拟三元条件:如果条件计算为 $true
,它被解释为数组索引 1
,否则为 0
.
-like
运算符支持与 Get-ChildItem
的 -Include
参数相同的通配符模式,但请注意后者的 -Filter
参数 - 而更快 - 仅支持不同的、功能较弱的模式 - 请参阅 this answer.
请找到脚本以获得准确的预期输出。
将路径替换为您的原始路径
$folder = Get-ChildItem -Path "C:\Users\***\Desktop\New folder\*.php" -Recurse -Force
foreach($file in $folder)
{
if($file.Name -match "^0_.*" -and $file.CreationTime -lt (Get-Date).AddMinutes(-360) )
{
Remove-item $file -Force -Recurse -ErrorAction SilentlyContinue
Write-Host "Deleted"$file.Name
}
elseif($file.Name -match "^1_.*" -and $file.CreationTime -lt (Get-Date).AddMinutes(-60))
{
Remove-item $file -Force -Recurse -ErrorAction SilentlyContinue
Write-Host "Deleted"$file.Name
}
else
{
Write-Host "No files found"
}
}
所以我的文件夹中有以
开头的文件1__
和
0__
示例文件
1__shal1absahal9182skab.php
0__abns1a3bshal54a4m5sb.php
我正在尝试让我的 powershell 脚本仅删除 1__
中早于 60 mins
的文件,而 0__
可以每隔 360 mins
删除一次。
这是我当前的代码
$limit = (Get-Date).AddMinutes(-360)
$path = "C:\cache"
# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
我的脚本目前将这两个文件视为相同的文件,并在 360 minute
节拍时删除它们。
找到了使用 if 和 else 以及一些正则表达式模式匹配的解决方案。
$limit_guest = (Get-Date).AddMinutes(-360) #6 hours
$limit_logged_in = (Get-Date).AddMinutes(-60) #1 hours
$path = "C:\cache"
# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { if ( $_ -match "^0__.*" ) { !$_.PSIsContainer -and $_.CreationTime -lt $limit_guest } else { !$_.PSIsContainer -and $_.CreationTime -lt $limit_logged_in } } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
可以精简
使用
-File
和-Directory
限制Get-ChildItem
只输出该类型的项目。将
开头的文件-Include
与 PowerShell wildcard expression 结合使用可将匹配限制为名称以0__
或1__
.
$now = Get-Date
$limit_guest = $now.AddMinutes(-360) #6 hours
$limit_logged_in = $now.AddMinutes(-60) #1 hour
# Delete files older than the $limit.
Get-ChildItem -File -Path $path -Recurse -Force -Include '[01]__*' |
Where-Object {
$_.CreationTime -lt ($limit_guest, $limit_logged_in)[$_.Name -like '1__*']
} | Remove-Item -Force -WhatIf
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Directory -Path $path -Recurse -Force |
Where-Object {
(Get-ChildItem -File -LiteralPath $_.FullName -Recurse -Force).Count -eq 0
} | Remove-Item -Force -Recurse -WhatIf
注意:上面命令中的-WhatIf
common parameter预览操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf
。
注:
($limit_guest, $limit_logged_in)[$_.Name -like '1__*']
通过根据条件$_.Name -like '1__*'
选择$limit_*
值之一来模拟三元条件:如果条件计算为$true
,它被解释为数组索引1
,否则为0
.-like
运算符支持与Get-ChildItem
的-Include
参数相同的通配符模式,但请注意后者的-Filter
参数 - 而更快 - 仅支持不同的、功能较弱的模式 - 请参阅 this answer.
请找到脚本以获得准确的预期输出。
将路径替换为您的原始路径
$folder = Get-ChildItem -Path "C:\Users\***\Desktop\New folder\*.php" -Recurse -Force
foreach($file in $folder)
{
if($file.Name -match "^0_.*" -and $file.CreationTime -lt (Get-Date).AddMinutes(-360) )
{
Remove-item $file -Force -Recurse -ErrorAction SilentlyContinue
Write-Host "Deleted"$file.Name
}
elseif($file.Name -match "^1_.*" -and $file.CreationTime -lt (Get-Date).AddMinutes(-60))
{
Remove-item $file -Force -Recurse -ErrorAction SilentlyContinue
Write-Host "Deleted"$file.Name
}
else
{
Write-Host "No files found"
}
}