В свободное время я работаю над сценарием дискового пространства для наших клиентов. Я только что протестировал его с помощью 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

0
Moridn 26 Фев 2016 в 04:02

2 ответа

Лучший ответ

Есть несколько вещей, которые следует изменить в вашем коде, но проблема, которая сейчас возникает у вас, заключается в том, что вы не указали -Path. Поэтому Get-ChildItem будет возвращать элементы из рабочего каталога !

 Get-ChildItem | Remove-Item -Recurse -WhatIf

Должно быть вместо

 Get-ChildItem $path | Remove-Item -Recurse -WhatIf

Как я уже сказал, есть несколько потенциальных ловушек и областей, требующих улучшения. Вы используете один и тот же цикл 5 раз. Пара точно такая же.

1
Matt 26 Фев 2016 в 02:01

Я считаю, что проблема в строке 23, где код не заполняет массив полными путями. См. Получение полного пути к файлам в PowerShell для получения некоторых советов. о том, как вместо этого получить полные пути.

0
Community 23 Май 2017 в 11:59