使用powershell从特定日期删除文件夹内的文件
Deleting files inside the folder from specific date using powershell
我的文件夹结构如下所示:
AK_Data |--->2020-01-22-------|----->a.txt
| |----->b.txt
| |------>c.tf.err
|
|--->2021-01-15-------|----->d.txt
| |----->b.txt
| |------>x.tf.err
|
|--->2022-01-08-------|----->dv.txt
| |----->pq.bat
|
|--->2022-05-08-------|----->xyz.pdf
AK_Data
是第一个包含多个 subfolders
的文件夹,例如 (2020-01-22,2021-01-15.....)
,每个子文件夹包含 1000
个不同格式的文件。
我需要进入每个文件夹并删除除名称中包含 ".tf.err"
的文件之外的所有文件。我用过$specificdate='2022-01-01'
表示文件夹小于2022-01-01
的文件只需要删除即可。所以我的预期输出是:
AK_Data |--->2020-01-22-------|------>c.tf.err
|
|
|
|--->2021-01-15-------|------>x.tf.err
|
|
|
|--->2022-01-08-------|----->dv.txt (this folder will be untouched since>2022-01-01)
| |----->pq.bat
|
|--->2022-05-08-------|----->xyz.pdf (this folder will be untouched since>2022-01-01)
我只需要删除文件夹里面的文件,不需要删除文件夹
我为此使用的 powershell 是:
cls
$specificdate='2022-01-01'
$destination = 'Y:\Data\Retail\ABC\Development\ak\AK_Data'
$files = Get-ChildItem $destination
$exte='\.(bz2)|(.bat)|(.err)|(~)'
foreach ($f in $files){
$outfile = $f.FullName -notmatch $exte
if ($outfile){
if ($f.Name -lt $specificdate){
$allfiles=Get-ChildItem $f.FullName -Exclude *.tf.err* -Name | remove-item -whatif
}
}
}
不是删除文件。
我会首先迭代目录的源文件夹路径,其名称可以转换为日期时间小于变量 $specificDate
.
中的日期时间
然后在这些文件夹中再次使用 Get-ChildItem
来查找并删除名称中没有 .tf.err
的文件:
$specificdate = [datetime]::ParseExact('2022-01-01','yyyy-MM-dd', $null)
$sourceFolder = 'Y:\Data\Retail\ABC\Development\ak\AK_Data\*'
Get-ChildItem -Path $sourceFolder -Directory |
Where-Object { [datetime]::ParseExact($_.Name,'yyyy-MM-dd', $null) -lt $specificdate } |
ForEach-Object {
Write-Host "Removing files from folder $($_.Name).."
Get-ChildItem -Path $_.FullName -File |
Where-Object { $_.Name -notlike '*.tf.err*' } |
Remove-Item -WhatIf
}
在这里,我再次添加了 -WhatIf
开关,这样您就可以首先看到 会 发生什么。
如果您同意,请再次删除 -WhatIf
和 运行 代码以实际删除文件
我的文件夹结构如下所示:
AK_Data |--->2020-01-22-------|----->a.txt
| |----->b.txt
| |------>c.tf.err
|
|--->2021-01-15-------|----->d.txt
| |----->b.txt
| |------>x.tf.err
|
|--->2022-01-08-------|----->dv.txt
| |----->pq.bat
|
|--->2022-05-08-------|----->xyz.pdf
AK_Data
是第一个包含多个 subfolders
的文件夹,例如 (2020-01-22,2021-01-15.....)
,每个子文件夹包含 1000
个不同格式的文件。
我需要进入每个文件夹并删除除名称中包含 ".tf.err"
的文件之外的所有文件。我用过$specificdate='2022-01-01'
表示文件夹小于2022-01-01
的文件只需要删除即可。所以我的预期输出是:
AK_Data |--->2020-01-22-------|------>c.tf.err
|
|
|
|--->2021-01-15-------|------>x.tf.err
|
|
|
|--->2022-01-08-------|----->dv.txt (this folder will be untouched since>2022-01-01)
| |----->pq.bat
|
|--->2022-05-08-------|----->xyz.pdf (this folder will be untouched since>2022-01-01)
我只需要删除文件夹里面的文件,不需要删除文件夹
我为此使用的 powershell 是:
cls
$specificdate='2022-01-01'
$destination = 'Y:\Data\Retail\ABC\Development\ak\AK_Data'
$files = Get-ChildItem $destination
$exte='\.(bz2)|(.bat)|(.err)|(~)'
foreach ($f in $files){
$outfile = $f.FullName -notmatch $exte
if ($outfile){
if ($f.Name -lt $specificdate){
$allfiles=Get-ChildItem $f.FullName -Exclude *.tf.err* -Name | remove-item -whatif
}
}
}
不是删除文件。
我会首先迭代目录的源文件夹路径,其名称可以转换为日期时间小于变量 $specificDate
.
然后在这些文件夹中再次使用 Get-ChildItem
来查找并删除名称中没有 .tf.err
的文件:
$specificdate = [datetime]::ParseExact('2022-01-01','yyyy-MM-dd', $null)
$sourceFolder = 'Y:\Data\Retail\ABC\Development\ak\AK_Data\*'
Get-ChildItem -Path $sourceFolder -Directory |
Where-Object { [datetime]::ParseExact($_.Name,'yyyy-MM-dd', $null) -lt $specificdate } |
ForEach-Object {
Write-Host "Removing files from folder $($_.Name).."
Get-ChildItem -Path $_.FullName -File |
Where-Object { $_.Name -notlike '*.tf.err*' } |
Remove-Item -WhatIf
}
在这里,我再次添加了 -WhatIf
开关,这样您就可以首先看到 会 发生什么。
如果您同意,请再次删除 -WhatIf
和 运行 代码以实际删除文件