我很想知道回显文件夹和子文件夹中文件的可能方法,并生成一个说明文件名的输出,这些文件名被选中以删除X天。
我想在两个不同的级别编写这个脚本
级别1: PowerShell脚本仅用于回显文件名,并为我提供已被识别为已删除的文件的输出。这应包括文件,包括文件夹和子文件夹。
级别2: 通过添加删除功能来组合level1脚本,这将删除文件夹和子文件夹中的文件。
我有一个移动脚本和一个要删除的直接脚本,但我想确保选择正确的文件,并且我想知道正在删除的文件名。
非常感谢任何帮助。
编辑从评论中添加
我一直在以非常简单的方式尝试这样的事情
Get-ChildItem -Path c:\test | where {$_.lastWriteTime -lt (Get-Date).addDays(-60)}
我想添加一些参数,它会在不同的文件夹位置生成文件名输出。
答案 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
这不能解答您的所有问题,但应该可以帮助您开始使用,我已经在代码中添加了大量注释,因此您应该能够完全遵循它。
# 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
}
答案 1 :(得分:0)
问题有点模糊,但我认为这就像你想要的那样 我喜欢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
}