Board logo

标题: [文件操作] 如何自动清除回收站中指定“删除日期”前的文件? [打印本页]

作者: locoman    时间: 2019-2-24 15:09     标题: 如何自动清除回收站中指定“删除日期”前的文件?

如何自动清除回收站中指定“删除日期”前的文件?

需求:
1. 回收站中的文件需要保存一段之间待恢复使用。
2. 但又希望回收站不存在太多的文件。
——因此,希望编个批处理能实现:每天能自动清除进入回收站内3天前的文件,“删除日期”在3天内的文件不清除。

谢谢大神的帮助!

作者: ivor    时间: 2019-2-24 15:59

本帖最后由 ivor 于 2019-2-24 16:03 编辑

https://gallery.technet.microsof ... in-Recycle-6d1fbb75
  1. #---------------------------------------------------------------------------------
  2. #The sample scripts are not supported under any Microsoft standard support
  3. #program or service. The sample scripts are provided AS IS without warranty  
  4. #of any kind. Microsoft further disclaims all implied warranties including,  
  5. #without limitation, any implied warranties of merchantability or of fitness for
  6. #a particular purpose. The entire risk arising out of the use or performance of  
  7. #the sample scripts and documentation remains with you. In no event shall
  8. #Microsoft, its authors, or anyone else involved in the creation, production, or
  9. #delivery of the scripts be liable for any damages whatsoever (including,
  10. #without limitation, damages for loss of business profits, business interruption,
  11. #loss of business information, or other pecuniary loss) arising out of the use
  12. #of or inability to use the sample scripts or documentation, even if Microsoft
  13. #has been advised of the possibility of such damages
  14. #---------------------------------------------------------------------------------
  15. #requires -version 2.0
  16. Import-LocalizedData -BindingVariable Message
  17. Function Get-oscRecycleBin
  18. {
  19. <#
  20. .SYNOPSIS
  21.         Get-oscRecycleBin is an advanced function which can be used to list items and delete items from recycle bin.
  22.     .DESCRIPTION
  23.         Get-oscRecycleBin is an advanced function which can be used to list items and delete items from recycle bin.
  24.     .PARAMETER  <ListAllItems>
  25. Lists all of the items of Recycle Bin.
  26. .PARAMETER  <DeleteDaysBefore>
  27. Delete of specified items in Recycle Bin.
  28. .PARAMETER  <ListDaysBefore>
  29. Lists of specified items in Recycle Bin.
  30.     .EXAMPLE
  31.         C:\PS> Get-oscRecycleBin -ListAllItems
  32. Name                    Type            Size        Deleted Days     Deleted Date
  33. ----                    ----            ----        ------------     ------------
  34. EnumerateInstalledPr... File folder     0.000 MB    13 Days          2/21/2012 4:44:00 PM
  35. edit_x64                File folder     0.000 MB    13 Days          2/21/2012 4:45:00 PM
  36. TestReview.zip          WinRAR ZIP      0.213 MB    10 Days          2/22/2012 9:49:00 AM
  37. TestReview              File folder     0.000 MB    10 Days          2/22/2012 10:16:00 AM
  38. TestReview              File folder     0.000 MB    5 Days           2/22/2012 11:22:00 AM
  39. A Total of [5] items in Recycle Bin.
  40.     .EXAMPLE
  41.         C:\PS> Get-oscRecycleBin -DeleteDaysBefore 11
  42. Name                    Type            Size        Deleted Days     Action
  43. ----                    ----            ----        ------------     ------------
  44. TestReview.zip          WinRAR ZIP      0.213 MB    10 Days          Deleted
  45. TestReview              File folder     0.000 MB    10 Days          Deleted
  46.     .EXAMPLE
  47.         C:\PS> Get-oscRecycleBin -ListDaysBefore 7
  48. Name                    Type            Size        Deleted Days     Deleted Date
  49. ----                    ----            ----        ------------     ------------
  50. TestReview              File folder     0.000 MB    5 Days           2/22/2012 11:22:00 AM
  51. #>
  52. [CmdletBinding(SupportsShouldProcess=$true)]
  53. Param
  54. (
  55. [Parameter(Mandatory=$true,Position=0,ParameterSetName='DeleteSpecified', `
  56. HelpMessage="Delete of specified items in Recycle Bin")]
  57. [Alias("deld")][Int32]$DeleteDaysBefore,
  58. [Parameter(Mandatory=$true,Position=0,ParameterSetName='ListSpecified', `
  59. HelpMessage="Lists of specified items in Recycle Bin")]
  60. [Alias("ld")][Int32]$ListDaysBefore,
  61. [Parameter(Mandatory=$true,Position=0,ParameterSetName='ListAll', `
  62. HelpMessage="Lists all of the items of Recycle Bin")]
  63. [Alias("all")][switch]$ListAllItems
  64. )
  65. BEGIN
  66. {
  67. $Objs = @()
  68. $Shell = New-Object -ComObject Shell.Application
  69. $Recycler = $Shell.NameSpace(0xa)
  70. }
  71. PROCESS
  72. {
  73. foreach($item in $Recycler.Items())
  74. {
  75. $Name = $item.Name
  76. $Type = $item.Type
  77. $Path = $item.Path
  78. $Size = "{0:N3}" -f $($item.Size/1MB)+" MB"
  79. $Deleted_Date = [DateTime]($Recycler.GetDetailsOf($item,2) -replace "\u200f|\u200e","")
  80. $Deleted_Days = "{0:N0}" -f [System.Math]::Abs((New-TimeSpan -Start `
  81. $(Get-Date) -End $Deleted_Date).Days) +" Days"
  82. $object = New-Object -TypeName PSObject
  83. $object | Add-Member -MemberType NoteProperty -Name "Name"  -Value $Name
  84. $object | Add-Member -MemberType NoteProperty -Name "Type"  -Value $Type
  85. $object | Add-Member -MemberType NoteProperty -Name "Size"  -Value $Size
  86. $object | Add-Member -MemberType NoteProperty -Name "Path"  -Value $Path
  87. $object | Add-Member -MemberType NoteProperty -Name "Deleted Days" -Value $Deleted_Days
  88. $object | Add-Member -MemberType NoteProperty -Name "Deleted Date" -Value $Deleted_Date
  89. $Objs += $object
  90. }
  91. #list all of the items in recycle bin.
  92. if($ListAllItems)
  93. {
  94. $PSCmdlet.WriteVerbose($Message.ListAllMsg)
  95. if($PSCmdlet.ShouldProcess("Recycle Bin","List all of items"))
  96. {
  97. $Objs|Select-Object "Name","Type","Size","Deleted Days","Deleted Date"| `
  98. Sort-Object "Deleted Date"|Format-Table
  99. Write-Host "A Total of [$($Objs.Count)] items in Recycle Bin.`r`n"
  100. }
  101. }
  102. #List of specified items in the recycle bin.
  103. if ($ListDaysBefore -gt 0)
  104. {
  105. $PSCmdlet.WriteVerbose($Message.ListMsg)
  106. if($PSCmdlet.ShouldProcess("Recycle Bin","List of specified items"))
  107. {
  108. $RecyclerItems = $Objs | Where-Object{$_."Deleted Date" -ge `
  109. (Get-Date).AddDays(-$ListDaysBefore)}
  110. if($RecyclerItems.Count -eq $null)
  111. {
  112. Write-Warning -Message "The item not found."
  113. }
  114. else
  115. {
  116. $RecyclerItems|Select-Object "Name","Type","Size","Deleted Days","Deleted Date"| `
  117. Sort-Object "Deleted Date"|Format-Table
  118. Write-Host "A Total of [$($RecyclerItems.Count)] items were deleted before $ListDaysBefore days.`r`n"
  119. }
  120. }
  121. }
  122. # Delete items that have been in the Recycle Bin more than 10 days.
  123. if($DeleteDaysBefore -gt 0)
  124. {
  125. $PSCmdlet.WriteVerbose($Message.DeleteMsg)
  126. if($PSCmdlet.ShouldProcess("Recycle Bin","Delete of specified items"))
  127. {
  128. $RecyclerItems = $Objs | Where-Object{$_."Deleted Date" -ge `
  129. (Get-Date).AddDays(-$DeleteDaysBefore)}
  130. if($RecyclerItems.Count -eq $null)
  131. {
  132. Write-Warning -Message "The item not found."
  133. }
  134. else
  135. {
  136. $RecyclerItems|Select-Object "Name","Type","Size","Deleted Days",`
  137. @{Name="Action";Expression={Remove-Item -Path $_.Path -Confirm:$false -Force -Recurse;
  138. if(Test-Path -Path $_.Path)
  139. {"Not Deleted"}
  140. else
  141. {"Deleted"}
  142. }}|Format-Table
  143. }
  144. }
  145. }
  146. }
  147. }
  148. Get-oscRecycleBin -DeleteDaysBefore 3
复制代码

作者: locoman    时间: 2019-3-6 11:03

回复 2# ivor
谢谢您的热情帮助!!
但是,复制代码保存为.bat运行报错,且回收站并未删除。
报错如下


F:\test>自动删除回收站3天前的文件.bat

F:\test>#-----------------------------------------------------------------------
----------
'#------------------------------------------------------------------------------
---' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#The sample scripts are not supported under any Microsoft standard suppo
rt
'#The' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#program or service. The sample scripts are provided AS IS without warra
nty
'#program' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#of any kind. Microsoft further disclaims all implied warranties includi
ng,
'#of' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#without limitation, any implied warranties of merchantability or of fit
ness for
'#without' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#a particular purpose. The entire risk arising out of the use or perform
ance of
'#a' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#the sample scripts and documentation remains with you. In no event shal
l
'#the' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#Microsoft, its authors, or anyone else involved in the creation, produc
tion, or
'#Microsoft' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#delivery of the scripts be liable for any damages whatsoever (including
,
'#delivery' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#without limitation, damages for loss of business profits, business inte
rruption,
'#without' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#loss of business information, or other pecuniary loss) arising out of t
he use
'#loss' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#of or inability to use the sample scripts or documentation, even if Mic
rosoft
'#of' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#has been advised of the possibility of such damages
'#has' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#-----------------------------------------------------------------------
----------
'#------------------------------------------------------------------------------
---' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>#requires -version 2.0
'#requires' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>Import-LocalizedData -BindingVariable Message
'Import-LocalizedData' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>Function Get-oscRecycleBin
'Function' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

F:\test>{
'{' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
命令语法不正确。

F:\test><#
作者: ivor    时间: 2019-3-6 11:55

powershell代码 和 bat混编参考:http://www.bathome.net/redirect. ... 1776&pid=216458
作者: Batcher    时间: 2019-3-6 13:21

回复 3# locoman


怎样执行 PowerShell 代码?
http://bbs.bathome.net/thread-31071-1-1.html
作者: locoman    时间: 2019-3-16 15:46

本帖最后由 locoman 于 2019-3-16 15:56 编辑

回复 5# Batcher

谢谢您这么多年一直在大家最需要的时候,无私的有力的支撑帮助大家!!非常的感谢和敬佩!!

为了实现主贴需求,也按照您的指点一步一步的操作,但2楼的代码运行后还是报错并不能实现需求——

一、将2楼的代码保存为D:\test.ps1文件;
二、按照以下步骤执行:

第1步:打开 CMD 命令行窗口,执行以下命令进入 PowerShell 提示符模式:
powershell
第2步:在 PowerShell 提示符下执行命令:
Set-ExecutionPolicy "RemoteSigned"
exit
第3步:在 CMD 命令行窗口里面执行ps1文件命令:
powershell -f "D:\test.ps1"

——以下是报错信息的部分,看似还是在对回收站文件的删除时间在判断,只是不能真正按照主贴需求删除文件:

所在位置 D:\test.ps1:84 字符: 20
+             $(Get-Date) -End <<<<  $Deleted_Date).Days) +" Days"
    + CategoryInfo          : WriteError: ( [New-TimeSpan], ParameterBinding
   Exception
    + FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Comm
   ands.NewTimeSpanCommand
无法将值“2019-2-24 上午 4:18”转换为类型“System.DateTime”。错误:“该字符串未
被识别为有效的 DateTime。有一个从索引 10 处开始的未知字。”


所在位置 D:\test.ps1:82 字符: 30
+             $Deleted_Date = [DateTime] <<<< ($Recycler.GetDetailsOf($item,2)
-replace "\u200f|\u200e","")
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException
New-TimeSpan : 无法将参数“End”绑定到目标。设置“End”时发生异常:“未将对象引
用设置到对象的实例。”

所在位置 D:\test.ps1:84 字符: 20
+             $(Get-Date) -End <<<<  $Deleted_Date).Days) +" Days"
    + CategoryInfo          : WriteError: (:) [New-TimeSpan], ParameterBinding
   Exception
    + FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Comm
   ands.NewTimeSpanCommand
无法将值“2019-3-16 下午 2:50”转换为类型“System.DateTime”。错误:“该字符串未
被识别为有效的 DateTime。有一个从索引 10 处开始的未知字。”

所在位置 D:\test.ps1:82 字符: 30
+             $Deleted_Date = [DateTime] <<<< ($Recycler.GetDetailsOf($item,2)
-replace "\u200f|\u200e","")
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

……,……以下省略……,……

@Batcher
还是请求您的热心和实力继续帮助我实现工作需求,谢谢拜托您了!!
一、主要需求功能已经在主贴中说明了;
二、采用powershell的话,即使是按照您指导的三步骤能执行实现需求,但是,针对那些女同事们拿给她们也是搞不定的。能否搞成象批处理文件那样一点击就执行完成才是最好的!





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2