Recently I had to deploy an application whose content files were larger than the default SCCM client cache size (5120 MB). This will return an error in the Software Center, such as:
0x87D01201 (The content download cannot be performed because there is not enough available space in cache or the disk is full.)
I didn’t want to permanently increase the cache size, or require that user do it manually, so I investigated some options and came up with a couple of simple PowerShell scripts that can increase or decrease the cache size. I put these scripts into a standard package and created a program for each script using a command-line like:
powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File .\Increase-CCMCacheSize
You then have various options for how you can run that. For example, my application was being deployed using a task sequence as there are multiple steps, so I simply right-click the task sequence and on the Advanced tab, I check the option to Run another program first:
This will increase the cache size before the task sequence starts to run, which means it will no longer give an error.
To restore the cache to it’s default size after the application install, I simply add an additional step in the task sequence at the end using the package I created:
I haven’t tested it, but you could do something similar with the standard package model by right-clicking the package program, and setting the Run another program first option. The only issue there is that there is no option to run the script to restore the cache size after, unless you create a kind of dependency chain, ie:
Restore Cache size > (depends on) My Package > (depends on) Increase Cache size
For applications, you could also use the capability for a dependecy chain, but you would need to create the script as an application and use a detection method.
Increase-CCMCacheSize
# Increase SCCM Client cache size to 20000 MB (20GB) $CCM = New-Object -com UIResource.UIResourceMGR $CC = $CCM.GetCacheInfo() $CacheSize = $CC.TotalSize if ($CacheSize -lt 20000) { write-host "Setting cache size to 20000" try { $CC.TotalSize = 20000 } Catch { $_ } }
Restore-CCMCacheSize
# Restore SCCM Client cache size to default (5120 MB) $CCM = New-Object -com UIResource.UIResourceMGR $CC = $CCM.GetCacheInfo() $CacheSize = $CC.TotalSize if ($CacheSize -gt 5120) { write-host "Setting cache size to 5120" try { $CC.TotalSize = 5120 } Catch { $_ } }
Detection Method
For an application detection method, you could also use a PowerShell script, something like this:
# Detection method to check the SCCM Client cache size $CCM = New-Object -com UIResource.UIResourceMGR $CC = $CCm.GetCacheInfo() $CacheSize = $CC.TotalSize if ($CacheSize -eq 20000) { write-host "Compliant" } Else { write-host "Not-Compliant" }
Do you know how to clear the cache also?
This should do it:
$cm = New-Object -ComObject UIResource.UIResourceMgr
$cmcache = $cm.GetCacheInfo()
$cmcache.GetCacheElements() | Foreach-Object {
$eid = $_.CacheElementId
$cmcache.DeleteCacheElement($eid)
}
I am trying this however the first time I add a computer to the collection for the task sequence it fails. We can then re-run the deployment and it works because the cache has been increased. The error we get is: instance of SoftDistAdvertDownloadFailedEvent