I recently discovered Rainmeter, a desktop customization tool that lets you use some really nice looking gadgets. I wanted a simple skin to show disk free space.
I have five volumes, I could have manually written a custom skin. (Rainmeter skins are INI files.) That would involve setting a measure section for each disk and a in another section define how the output looks. Or I could take the much more time consuming task of writing a PowerShell script to iterate through my disks and write the skin INI file.
Download RainmeterDisksSkin.ZIP
The body of the script:
# Stop on the first error
$ErrorActionPreference = "Stop"
$RainmeterPath = [environment]::getfolderpath("mydocuments") + "\Rainmeter\Skins\"
$SkinName = "Kenward"
$FileName = "disks.ini"
If (-Not (Test-Path $($RainmeterPath + $SkinName))) {
Set-Location $RainmeterPath
mkdir $SkinName
}
$OutFile = $RainmeterPath + $SkinName + "\" + $FileName
$Disks = Get-Volume | where {$_.DriveType -eq "Fixed"} | sort -Property DriveLetter
$Disks
$Header = @"
[Rainmeter]
Update=1000
[Variables]
vFontName=Segoe UI Light
vFontColor=255,255,255,255
vSolidColor=0,0,0,128
vFontSize=14
vStringCase=Lower
"@
$MeterCommon = @"
`n[MeterDriveInfo]
NumOfDecimals=0
FontFace=#vFontName#
FontSize=#vFontSize#
Meter=String
X=0
Y=0
FontColor=#vFontColor#
SolidColor=#vSolidColor#
AntiAlias=1
AutoScale=1
StringCase=#vStringCase#
"@
Out-File -FilePath $Outfile -InputObject $Header
foreach ($Disk in $Disks) {
Out-File -FilePath $Outfile -Append -InputObject "`n[MeasureFreeDiskSpace$($Disk.DriveLetter)]"
Out-File -FilePath $Outfile -Append -InputObject "Measure=FreeDiskSpace"
Out-File -FilePath $Outfile -Append -InputObject "Drive=$($Disk.DriveLetter):"
Out-File -FilePath $Outfile -Append -InputObject "UpdateDivider=5"
}
Out-File -FilePath $Outfile -Append -InputObject $MeterCommon
for ($i = 0; $i -le $Disks.count - 1; $i++)
{
if ($i -eq 0) {
$Output = "MeasureName=MeasureFreeDiskSpace$($Disks[$i].DriveLetter)"
$TextValue = "text = ""$($Disks[$i].DriveLetter) drive %1B free"
}
else {
$Output = "MeasureName$($i+1)=MeasureFreeDiskSpace$($Disks[$i].DriveLetter)"
$TextValue += "#crlf#$($Disks[$i].DriveLetter) drive %$($i + 1)B free"
}
Out-File -FilePath $Outfile -Append -InputObject $Output
}
Out-File -FilePath $Outfile -Append -InputObject $($TextValue + '"')
