调试磁盘空间清理脚本 - 删除它不应该的文件

时间:2016-02-26 01:02:04

标签: arrays powershell logging

我正在为我的客户制作磁盘空间脚本。我刚刚使用ISE对它进行了测试,看起来它一直工作,直到我检查了成绩单。

在第32行的第一个删除周期中有一些部分正在删除C:\ Windows \ System32 \中的文件,这当然我不想要它。我确信我做错了什么,但我检查过拼写错误,我不明白如何从用户目录中获取%system32%。

If (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
    {
        $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + ' (Elevated)'
        $Host.UI.RawUI.BackgroundColor = 'DarkBlue'
        Clear-Host
    }
Else
    {
        $newProcess = New-Object Diagnostics.ProcessStartInfo 'PowerShell'
        $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"
        $newProcess.Verb = 'runas'
        [Diagnostics.Process]::Start($newProcess) | Out-Null
        exit
    }
If ((Test-Path "C:\DiskSpaceCleanupLog\") -eq $False)
    {
        New-Item -ItemType Directory -Path "C:\DiskSpaceCleanupLog\"
    }
$Date = [string]::Format( "{0:dd-MM-yyyy}", [datetime]::Now.Date )
$LogName = "C:\DiskSpaceCleanupLog\" + $Date + "Log.txt"
Start-Transcript $LogName
$Path = @()
$Array = @(Get-ChildItem C:\Users | Select-Object Name)
Read-Host -Verbose "Removing User Account temp files..."
Foreach ($Name IN $Array)
    {

        $Path = ("C:\Users\" + $Name.Name + "\AppData\Local\Temp\")
    }              
Foreach ($Path IN $Array)
    {
        Get-ChildItem | Remove-Item -Recurse -WhatIf
    }
Remove-Variable Path
Read-Host -Verbose "Removing User Account crash dumps..."
Foreach ($Name IN $Array)
    {
        $Path = ("C:\Users\" + $Name.Name + "\AppData\Local\CrashDumps\")
    }
Foreach ($Path IN $Array)
    {
        Get-ChildItem | Remove-Item -Recurse -WhatIf
    }
Remove-Variable Path
Read-Host -Verbose "Removing User Account reporting files..."
Foreach ($Name IN $Array)
    {
        $Path = ("C:\Users\" + $Name.Name + "\AppData\Local\Microsoft\Windows\WER\ReportArchive\")
    }              
Foreach ($Temp IN $Path)
    {
        Get-ChildItem | Remove-Item -Recurse -WhatIf
    }
Remove-Variable Path
Read-Host -Verbose "Removing User Account temp files from Internet Explorer..."
Foreach ($Name IN $Array)
    {
        $Path = ("C:\Users\" + $Name.Name + "\AppData\Local\Microsoft\Windows\Temporary Internet Files\")
    }              
Foreach ($Temp IN $Path)
    {
        Get-ChildItem | Remove-Item -Recurse -WhatIf
    }
Read-Host -Verbose "Removing Recycle Bin files..."
Remove-Item -LiteralPath 'C:\$Recycle.Bin\' -Recurse -WhatIf
Read-Host -Verbose "Removing global crash dumps..."
Remove-Item "C:\ProgramData\Microsoft\Windows\WER\ReportQueue" -Recurse -WhatIf
Remove-Item "C:\ProgramData\Microsoft\Windows\WER\ReportArchive" -Recurse -WhatIf
Read-Host -Verbose "Removing Windows Update cached files..."
Stop-Service -DisplayName 'Windows Update'
Remove-Item "C:\Windows\SoftwareDistribution\Download\*" -Recurse -WhatIf
Start-Service -DisplayName 'Windows Update'
Remove-Variable Array, Path
Read-Host -Verbose "Cleaning base image of update cache..."
DISM.exe /Online /Cleanup-Image /SPSuperseded
Read-Host -Verbose "Running Windows Clean Manager..."
$OSVersion = Get-WMIObject -Class Win32_OperatingSystem | Format-Table Version
If ($OSVersion -le 6.1)
    {
        cleanmgr.exe /verylowdisk
    }
Read-Host -Verbose "Removal is complete. Sending logs..."
Stop-Transcript
$SecurePassword = ConvertTo-SecureString "InsertPasswordHere" -AsPlainText -Force
$emailcredential = New-Object System.Management.Automation.PSCredential ("email@domain.com", $SecurePassword)
Send-MailMessage -To "Name Here <email@domain.com>" -From "Name Here <email@domain.com>" -Subject ("Disk Space Cleanup Log - " + $Date) -Body "Attached is the log from the script." -Attachments $LogName -SmtpServer "smtp.office365.com" -Credential $emailcredential -UseSSL -Port "587" -DeliveryNotificationOption OnFailure

第32行是Get-ChildItem | Remove-Item -Recurse -WhatIf

2 个答案:

答案 0 :(得分:1)

您的代码中应该调整几项内容,但现在遇到的问题是您没有指定??。因此-Path将从工作目录返回项目!

Get-ChildItem

应该是

 Get-ChildItem | Remove-Item -Recurse -WhatIf

就像我说的那样,有几个潜在的陷阱和改进领域有待解决。你使用相同的循环5次。一对夫妇完全一样。

答案 1 :(得分:0)

我认为问题出在第23行,其中代码没有使用完整路径名填充数组。有关如何获取完整路径名的一些建议,请参阅Get full path of the files in PowerShell