首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试磁盘空间清理脚本-删除不应该删除的文件

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

Stack Overflow用户
提问于 2016-02-26 01:02:03
回答 2查看 233关注 0票数 0

我正在为我们的客户做一个磁盘空间脚本在我的休息时间。我刚刚用ISE测试了它,看上去很正常,直到我检查了记录。

在第一个删除周期中,在第32行周围有一些部分,其中删除C:\Windows\System32 32中的文件,当然,我不希望这样做。我肯定我做错了什么,但我已经检查了输入,我不明白它如何从用户目录中获得%system32 32%。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-26 01:47:09

这是需要在代码中进行调整的几个方面,但是您现在遇到的问题是您没有指定一个-Path。因此,Get-ChildItem将从工作目录返回项目!

代码语言:javascript
复制
 Get-ChildItem | Remove-Item -Recurse -WhatIf

应该是

代码语言:javascript
复制
 Get-ChildItem $path | Remove-Item -Recurse -WhatIf

正如我所说,尽管有几个潜在的缺陷和改进领域需要解决。使用相同的循环5次。一对完全一样的人。

票数 1
EN

Stack Overflow用户

发布于 2016-02-26 01:23:35

我相信问题出现在第23行,在第23行,代码没有用完整的路径名填充数组。有关如何获得完整路径名的建议,请参见Get full path of the files in PowerShell

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35641489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档