Very common trouble on corporative network that have
laptop/computer with small hard drive or small SSD same as used by several
persons especially if are working on Outlook
As example HP Elite Book Revolver 810 G1 (hard drive 120 GB)
have 200 MB Free Space
First start any Space Analyzer
like SpaceSniffer as Administrator to have access system and users folders and
receive actual information. If you will see lot off Application Data that have
big size it’s mean or probably .ost (Outlook) file or personal data. Remember - if .ost file have size 50 GB and more user can't send/receive e-mail. Same as from 25..30 till 50 GB can have trouble send/receive functions. We can
delete .ost files use PowerShell script: OST_Delete.ps1
Function Convert-Size {
<#
.SYSNOPSIS
Converts a size in bytes to its
upper most value.
.DESCRIPTION
Converts a size in bytes to its
upper most value.
.PARAMETER Size
The size in bytes to convert
.NOTES
Author: Boe Prox
Date Created: 22AUG2012
.EXAMPLE
Convert-Size -Size 568956
555 KB
Description
-----------
Converts the byte value 568956 to upper
most value of 555 KB
.EXAMPLE
Get-ChildItem | ? {! $_.PSIsContainer} | Select -First 5 |
Select Name, @{L='Size';E={$_ | Convert-Size}}
Name
Size
---- ----
Data1.cap
14.4 MB
Data2.cap
12.5 MB
Image.iso
5.72 GB
Index.txt
23.9 KB
SomeSite.lnk
1.52 KB
SomeFile.ini 152
bytes
Description
-----------
Used with Get-ChildItem and custom
formatting with Select-Object to list the uppermost size.
#>
[cmdletbinding()]
Param (
[parameter(ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
[Alias("Length")]
[int64]$Size
)
Begin {
If (-Not $ConvertSize) {
Write-Verbose ("Creating
signature from Win32API")
$Signature = @"
[DllImport("Shlwapi.dll", CharSet = CharSet.Auto)]
public static extern long
StrFormatByteSize( long fileSize, System.Text.StringBuilder buffer, int
bufferSize );
"@
$Global:ConvertSize = Add-Type -Name
SizeConverter -MemberDefinition $Signature -PassThru
}
Write-Verbose ("Building buffer
for string")
$stringBuilder = New-Object
Text.StringBuilder 1024
}
Process {
Write-Verbose ("Converting {0} to
upper most size" -f $Size)
$ConvertSize::StrFormatByteSize( $Size,
$stringBuilder, $stringBuilder.Capacity ) | Out-Null
$stringBuilder.ToString()
}
}
function
Find-File([string]$folderPath)
{
if (Test-Path $folderPath)
{
try
{
[string[]]$childFolderPaths =
[System.IO.Directory]::GetDirectories($folderPath)
foreach($childPath in
$childFolderPaths)
{
[System.IO.DirectoryInfo]$di =
New-Object System.IO.DirectoryInfo($childPath)
if (($di.Attributes -band
[System.IO.FileAttributes]::ReparsePoint) -ne
[System.IO.FileAttributes]::ReparsePoint)
{
<#
This is the recursive part.
That is, this function calls itself in order to process child directories.
#>
Find-File $childPath
}
}
[string[]]$filePaths =
[System.IO.Directory]::GetFiles($folderPath, "*.*",
[System.IO.SearchOption]::TopDirectoryOnly)
foreach($filePath in $filePaths)
{
<#
Here is where you'd take
whatever action you want. I'm looking for files named AssemblyInfo.cs and displaying
their full paths.
#>
if
(([System.IO.Path]::GetFileName($filePath)) -like "*.ost")
{
#Write-Host $filePath
-ForegroundColor DarkGreen
Return $filePath
}
}
}
catch
{Write-Host ($Error[0])
-ForegroundColor Red}
}
}
#5297
cls
$AllUsersPath =
"C:\Users"
$AllUsersPath = get-ChildItem
$AllUsersPath -Name
for($counter = 0; $counter -lt
$AllUsersPath.Count; $counter++)
{
#$AllUsersPath[$counter]
$OST_Folder = "C:\users\"
$OST_Folder += $AllUsersPath[$counter]
$OST_Folder +=
"\AppData\Local\Microsoft\Outlook"
#$OST_Folder
if ((Test-Path -Path $OST_Folder) -eq
$true)
{
if ((get-ChildItem $OST_Folder | where
{ $_.Extension -eq ".ost"}).Exists -eq $true)
{
$result = Find-File $OST_Folder
$result_size = Convert-Size -Size
((Get-ItemProperty $result).Length)
Write-Host "Do you want
delete?"
Write-Host "file name: "
-ForegroundColor White -NoNewline
Write-Host $result -ForegroundColor
Green
Write-Host "file size: "
-NoNewline -ForegroundColor White
Write-Host $result_size
-ForegroundColor Green
Write-Host
"-------------------"
$delete_request = Read-Host "
Yes; any key - not"
switch ($delete_request)
{
'y' {
cls
remove-Item $result;
Write-Host "OST file "
Write-Host "file name:
" -ForegroundColor White -NoNewline
Write-Host $result
Write-Host "file size:
" -ForegroundColor White -NoNewline
Write-Host $result_size
Write-Host "
DELETED" -ForegroundColor Green}
default {
cls
Write-Host "OST file "
Write-Host "file
name: " -ForegroundColor White -NoNewline
Write-Host $result
Write-Host "file
size: " -ForegroundColor White -NoNewline
Write-Host $result_size
Write-Host " NOT
DELETED" -ForegroundColor Red
}
}
}
}
}
Write-Host
"-------------------"
Write-Host
"script FINISHED" -ForegroundColor Green
Same can have free space profit by delete Search database (can
have size 50 GB)
c:\>sc config wsearch start= disabled
c:\>sc stop wsearch
c:\>del C:\ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb
and disable Hybernate mode (profit – 2..8 GB)
c:\>powercfg.exe /hibernate off
don’t forget check and clean if need “C:\Windows\ccmcache” and
windows update folder same
P.S. Below start powershell
script from command line and auto request UAC window for start as administrator.
Script must be located on same folder where PS script: Start-Delete_OST.bat
::::::::::::::::::::::::::::::::::::::::::::
:: Automatically check & get
admin rights V2
::::::::::::::::::::::::::::::::::::::::::::
@echo off
CLS
ECHO.
ECHO
=============================
ECHO Running Admin shell
ECHO
=============================
:init
setlocal DisableDelayedExpansion
set "batchPath=%~0"
for %%k in (%0) do set
batchName=%%~nk
set
"vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto
gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV &
shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege
Escalation
ECHO
**************************************
ECHO Set UAC =
CreateObject^("Shell.Application"^) >
"%vbsGetPrivileges%"
ECHO args = "ELEV "
>> "%vbsGetPrivileges%"
ECHO For Each strArg in
WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg
^& " " >>
"%vbsGetPrivileges%"
ECHO Next >>
"%vbsGetPrivileges%"
ECHO UAC.ShellExecute
"!batchPath!", args, "", "runas", 1 >>
"%vbsGetPrivileges%"
"%SystemRoot%\System32\WScript.exe"
"%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & pushd .
cd /d %~dp0
if '%1'=='ELEV' (del
"%vbsGetPrivileges%" 1>nul 2>nul &
shift /1)
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
REM Run shell as admin (example)
- put here code as you like
ECHO %batchName% Arguments: %1 %2
%3 %4 %5 %6 %7 %8 %9 %~dp0
reg add
"HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
/v ExecutionPolicy /d RemoteSigned /f
powershell.exe %~dp0\OST_Delete.ps1
pause
reg
add
"HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
/v ExecutionPolicy /d Restricted /f
change your PS script name only