Functions/New-DatePicker.ps1
function New-DatePicker { <# .SYNOPSIS Provides a GUI representation of a calendar where you select a date. Click OK or press [Enter] to return the date selected. If click Cancel or press [Esc] $null is returned. .DESCRIPTION Provides a GUI representation of a calendar where you select a date. Click OK or press [Enter] to return the date selected. If click Cancel or press [Esc] $null is returned. .PARAMETER Title The title of the form. Defaults to 'Select a date' .PARAMETER IncludeTime Switch to include time as part of the picker. Format is 'ddd MM/dd/yyyy HH:mm' where MM represents the 2 digit month (01-12), HH represents the hour using a 24 hour clock (00-23) and mm represents the 2 digit minute (00-59). Seconds are truncated to 00. .PARAMETER Date Default datetime value for the dialog box .NOTES If -IncludeTime is not specified the time is truncated to midnight (the zero hour) of the day selected. .EXAMPLE New-DatePicker -Title 'This is my custom title' -Verbose VERBOSE: Starting [New-DatePicker] VERBOSE: Title [This is my custom title] Tuesday, August 3, 2021 12:00:00 AM VERBOSE: Ending [New-DatePicker] .EXAMPLE New-DatePicker -Verbose VERBOSE: Starting [New-DatePicker] VERBOSE: Title [Select a date] Tuesday, August 3, 2021 12:00:00 AM VERBOSE: Ending [New-DatePicker] .EXAMPLE New-DatePicker -IncludeTime Wednesday, August 4, 2021 4:55:00 PM #> [CmdletBinding(ConfirmImpact = 'None')] [OutputType('datetime')] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] param ( [Parameter(Position = 0)] [string] $Title = 'Select a date', [switch] $IncludeTime, [datetime] $Date ) begin { Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]" Write-Verbose -Message "Title [$Title]" Add-Type -AssemblyName 'System.Windows.Forms' Add-Type -AssemblyName 'System.Drawing' #~~< DatePicker >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $DatePicker = New-Object -TypeName System.Windows.Forms.Form $DatePicker.ClientSize = New-Object -TypeName System.Drawing.Size -ArgumentList (460, 262) $DatePicker.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D $DatePicker.Text = $Title $DatePicker.AutoSize = $true $DatePicker.AutoSizeMode = 'GrowOnly' #~~< OKButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $OKButton = New-Object -TypeName System.Windows.Forms.Button $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK $OKButton.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (362, 31) $OKButton.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (75, 23) $OKButton.TabIndex = 1 $OKButton.Text = 'OK' $OKButton.UseVisualStyleBackColor = $true $DatePicker.AcceptButton = $OKButton #~~< CancelButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $CancelButton = New-Object -TypeName System.Windows.Forms.Button $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $CancelButton.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (362, 73) $CancelButton.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (75, 23) $CancelButton.TabIndex = 2 $CancelButton.Text = 'Cancel' $CancelButton.UseVisualStyleBackColor = $true $DatePicker.CancelButton = $CancelButton #~~< DateTimePicker >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $DateTimePicker = New-Object -TypeName System.Windows.Forms.DateTimePicker $DateTimePicker.Location = New-Object -TypeName System.Drawing.Point -ArgumentList (30, 32) $DateTimePicker.Size = New-Object -TypeName System.Drawing.Size -ArgumentList (264, 22) $DateTimePicker.TabIndex = 0 $DatePicker.Controls.Add($CancelButton) $DatePicker.Controls.Add($OKButton) $DatePicker.Controls.Add($DateTimePicker) #region myCustomFormCode $DatePicker.AutoSize = $true $DatePicker.AutoSizeMode = 'GrowOnly' $DatePicker.Font = [System.Drawing.SystemFonts]::get_MessageBoxFont() $OKButton.Font = [System.Drawing.SystemFonts]::get_MessageBoxFont() $CancelButton.Font = [System.Drawing.SystemFonts]::get_MessageBoxFont() if ($Script:ModulePath) { $DatePicker.Icon = (Join-Path -Path $Script:ModulePath -ChildPath 'PoshFunctions.ico') } if ($IncludeTime) { $DateTimePicker.Format = [System.Windows.Forms.DateTimePickerFormat]::Custom $DateTimePicker.CustomFormat = 'ddd MM/dd/yyyy HH:mm' } if ($Date) { $DateTimePicker.Value = $Date } #endregion } process { [System.Windows.Forms.Application]::EnableVisualStyles() $Result = $DatePicker.ShowDialog() if ($Result -eq 'OK') { if ($IncludeTime) { $DateTimePicker.Value = Get-Date -Date $DateTimePicker.Value -Second 0 -Millisecond 0 } else { $DateTimePicker.Value = Get-Date -Date $DateTimePicker.Value -Hour 0 -Minute 0 -Second 0 -Millisecond 0 } $DateTimePicker.Value } } end { Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]" } } |