PowerShell/docs/check-moon-phase.md
2024-11-20 11:52:20 +01:00

2.2 KiB

The check-moon-phase.ps1 Script

This PowerShell script determines the Moon phase and answers by text-to-speech (TTS).

Parameters

/home/markus/Repos/PowerShell/scripts/check-moon-phase.ps1 [<CommonParameters>]

[<CommonParameters>]
    This script supports the common parameters: Verbose, Debug, ErrorAction, ErrorVariable, WarningAction, 
    WarningVariable, OutBuffer, PipelineVariable, and OutVariable.

Example

PS> ./check-moon-phase

Notes

Author: Markus Fleschutz | License: CC0

https://github.com/fleschutz/PowerShell

Script Content

<#
.SYNOPSIS
	Checks the Moon phase
.DESCRIPTION
	This PowerShell script determines the Moon phase and answers by text-to-speech (TTS).
.EXAMPLE
	PS> ./check-moon-phase
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz | License: CC0
#>

try {
	$LunarCycle = 29.53058868 # synodic period in days, time between successive new moons
	$LunarHalfCycle = $LunarCycle / 2.0
	$Phases = @("New moon", "Waxing crescent moon", "First quarter moon", "Waxing gibbous moon", "Full moon", "Waning gibbous moon", "Last quarter moon", "Waning crescent moon")
	$PhaseLength = $LunarCycle / 8.0
	$PhaseHalfLength = $PhaseLength / 2.0

	$RefDate = get-date -Year 2021 -Month 12 -Day 4 -Hour 6 -Minute 43 # Dec 4, 2021 06:43 UTC [New Moon]
	$Now = get-date
	$TimeInterval = New-TimeSpan -Start $RefDate -End $Now
	$Days = $TimeInterval.TotalDays

	$MDays = $Days % $LunarCycle
	$PhaseIndex = [int]($MDays * (8.0 / $LunarCycle))

	$Visibility = [math]::Round((($Days % $LunarHalfCycle) * 100) / $LunarHalfCycle)
	$Reply = "$($Phases[$PhaseIndex]) with $($Visibility)% visibility"

	$MoonAge = [math]::Round($Days % $LunarCycle)	
	if ($MoonAge -eq "0") {	      $Reply += " today"
	} elseif ($MoonAge -eq "1") { $Reply += " since yesterday"
	} else {                      $Reply += ", last new moon was $MoonAge days ago"
	}

	& "$PSScriptRoot/speak-english.ps1" "$Reply"
	exit 0 # success
} catch {
	"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}

(generated by convert-ps2md.ps1 as of 11/20/2024 11:51:51)