【问题标题】:PowerShell script to echo files from folders and subfolders and then delete files over X days oldPowerShell 脚本从文件夹和子文件夹中回显文件,然后删除超过 X 天的文件
【发布时间】:2013-02-04 09:43:15
【问题描述】:

我很想了解在文件夹和子文件夹中回显文件并生成说明文件名的输出的可能方法,这些文件名被拾取以删除 X 天前的文件。

我想在两个不同的层次上编写这个脚本

1 级: PowerShell 脚本仅用于回显文件名并为我提供已确定要删除的文件的输出。这应该包括文件,包括文件夹和子文件夹。

2 级: 通过添加删除功能来组合 level1 脚本,这将删除文件夹和子文件夹中的文件。

我有一个要删除的移动脚本和一个直接脚本,但我想确保选择了正确的文件,并且我想知道要删除的文件名。

非常感谢任何帮助。

编辑从评论中添加

我一直在以一种非常简单的方式尝试这样的事情

Get-ChildItem -Path c:\test | where {$_.lastWriteTime -lt (Get-Date).addDays(-60)} 

我想添加一些参数,它会在不同的文件夹位置生成文件名的输出。

【问题讨论】:

  • 请在问题中添加更多内容,并表明您至少做了一些初步的努力。这不是人们为您编写脚本的地方,而是帮助您修复和更好地理解它们的地方。
  • 当然克里斯托弗...我完全同意你的话并尊重这个论坛。我不会超出论坛的范围。我一直在以一种非常简单的方式尝试这样的事情 Get-ChildItem -Path c:\test | where {$_.lastWriteTime -lt (Get-Date).addDays(-60)} 我想添加一些参数,它会在不同的文件夹位置生成文件名的输出。在此先感谢.....
  • 这还不清楚。你想提供前。路径作为函数参数?输出会是什么样子?什么是“不同文件夹位置中的文件名”?在问题中提供样本,而不是 cmets
  • @Graimer,是的,我想提供路径作为函数参数,输出想要文件的名称,这些文件是在 X 天之前被删除的。可以说。我正在使用 Get-ChildItem -Path c:\test |其中 {$_.lastWriteTime -lt (Get-Date).addDays(-60)} 这将读取早于 X 天的文件,但不会生成文件名的任何输出。非常清楚,我需要一个文件名的输出,这些文件名正在被删除。
  • 要补充上述评论,我希望在不同的位置有一个输出。如果我仍然不清楚,请告诉我....

标签: powershell powershell-2.0 powershell-3.0 powershell-1.0


【解决方案1】:

我认为这符合您的需求,我向您介绍了一些您可能不知道的概念,例如cmdletbinding,它允许您使用 -whatif 参数空运行脚本.您还可以提供 -verbose 以查看沿途发生的情况,此时您也可以使用 Add-Content cmdlet 附加到日志。

所以你可以这样运行它:

.\DeleteOldFiles.ps1 -Path c:\test -Age 50 -WhatIf -Verbose

然后,当您准备好删除文件时,您可以在不使用 -WhatIf 参数的情况下运行它:

.\DeleteOldFiles.ps1 -Path c:\test -Age 50 -Verbose

这并不能回答您的所有问题,但应该可以帮助您入门,我在代码中放置了很多 cmets,因此您应该能够全部理解。

# Add CmdletBinding to support -Verbose and -WhatIf 
[CmdletBinding(SupportsShouldProcess=$True)]
param
(
    # Mandatory parameter including a test that the folder exists       
    [Parameter(Mandatory=$true)]
    [ValidateScript({Test-Path $_ -PathType 'Container'})] 
    [string] 
    $Path,

    # Optional parameter with a default of 60
    [int] 
    $Age = 60   
)

# Identify the items, and loop around each one
Get-ChildItem -Path $Path | where {$_.lastWriteTime -lt (Get-Date).addDays(-$Age)} | ForEach-Object {

    # display what is happening 
    Write-Verbose "Deleting $_ [$($_.lastWriteTime)]"

    # delete the item (whatif will do a dry run)
    $_ | Remove-Item
}

【讨论】:

    【解决方案2】:

    这个问题有点模糊,但我认为这就是你想要的。
    我喜欢 David Martin 的回答,但根据您的技能水平和需求,它可能有点过于复杂。

    param(
        [string]$Path,
        [switch]$LogDeletions
    )
    
    foreach($Item in $(Get-ChildItem -Path $Path | where {$_.lastWriteTime -lt (Get-Date).addDays(-60)}))
    {
        if($LogDeletions)
        {
            $Item | Out-File "C:\Deleted.Log" -Append
        }
        rm $Item
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-09
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多