Powershell:单个脚本“清理”多个文件夹,其中包含超过

Powershell:单个脚本“清理”多个文件夹,其中包含超过

我想创建一个维护脚本,该脚本将在每台服务器上运行,以清除常见的放置/存档目录。最好该脚本使用参考文件作为文件夹路径和所需的时效限制。然后,该脚本将清除该路径中超过时效限制的文件。输入参考文件将如下所示:

c:\logs\iis\siteA\ 30
c:\logs\job1\ 60
e:\archive\clientA\ 90

第一个部分是文件路径;第二个部分是文件应保留的天数,中间用空格分隔。

现在对于脚本我有以下内容;但是,令人尴尬的是,我缺乏脚本编写经验。(我更注重网络)

#Attempted loop
Foreach ($ParentDir = Get-Content .\paths.txt $arg1, $arg2)
{$limit = (Get-Date).AddDays(-$arg2)
$path = $ParentDir

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force}

我觉得逻辑很接近,但我的语法不对。我的方法可行吗?有更好的方法吗?你能帮我解决语法问题吗?使用 poweshell v3。

我从中吸取了很多逻辑,值得称赞致命狗邮政。

答案1

编辑以包含您请求的文本文件

c:\logs\iis\siteA\ -30
c:\logs\job1\ -60
e:\archive\clientA\ -90

我对新的代码片段与我现有的代码片段分开进行了测试,但我认为它仍然可以实现你想要的效果。

$controlfile = "c:\path\to\yourfile.txt"    
$curr_date = Get-Date

New-Item -ItemType directory -Path f:\delete

foreach ($line in get-content $controlfile)
{
    $split = $line.split(" ")
    $file_path = $split[0]
    $max_days = $split[1]

    $del_date = $curr_date.AddDays($max_days)

    # move the files to the kill directory
    Get-ChildItem $file_path | Where-Object { $_.LastWriteTime -lt $del_date } |  Move-Item -destination "f:\delete"
}

将其移动到不同目录的原因是显然递归删除中有一个错误,并且我的数据有很多很多子目录深,因此,一旦我将所有内容移动到 kill 目录,我就会运行以下命令:

del /f/s/q f:\delete > nul
rmdir /s/q f:\delete

如果您没有遇到此问题,则可以将其添加到上述 PowerShell 代码的末尾:

$del_dir = "f:\delete"
$fso = New-Object -ComObject scripting.filesystemobject
$fso.DeleteFolder($del_dir)

答案2

您可以为此创建一个 cmdlet,以便您也可以在命令行中使用它:

命令

param(
    [string]$folder,
    [int]$expiry
)

ls $folder | % { if ($_.LastWriteTime -le (date).AddDays(-$expiry)) { rm $_ -fo } }

用法

.\script.ps1 -folder "c:\logs\iis\siteA\"  -expiry 30
.\script.ps1 -folder "c:\logs\job1\"       -expiry 60
.\script.ps1 -folder "e:\archive\clientA\" -expiry 90

相关内容