# encoding: ascii # api: powershell # title: Set-WinSchedule # description: Set-WinSchedule gives a GUI to select a schedule and schedules a task using schtasks. This is a beta. There are still a lot of features to implement. Please read through the synopsis->Description to see the list of features that I hope to get in a final release. # version: 1.0 # type: script # author: Tome Tanasovski # license: CC0 # function: Set-WinSchedule # x-poshcode-id: 1695 # x-archived: 2010-03-31T09:36:41 # # # Set-WinSchedule # Written by Tome Tanasovski # http://powertoe.wordpress.com # version 1.0 # Created March 2010 # # Please read through the synopsis->Description to see the list of features that I hope to get # in a final release. If you choose to work on any of the issues by all means, but please contact # me to let me know so that no effort is duplicated # Winform Assemblies [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null function Set-WinSchedule { <# .Synopsis Creates a winform to select a schedule and creates a scheduled task .Description Set-WinSchedule gives a GUI to select a schedule and schedules a task using schtasks This is a beta. There are still a lot of features to implement: Need to have more scheduling options. I expect to have all options available in a recurring outlook calendar item Need to have methods for scheduling with all 3 providers: schtasks, wmi, and at. Currently it only uses schtasks Need to design the return object properties: Should contain the text paths for each provider type Should contain a date/time for start time Need to provide a method to overwrite an existing task if it has the same name and the user confirms that it is ok to overwrite. Should also provide a -force parameter for this option. Need to ensure that files piped from get-item will be scheduled Need a parameter to override ok box at the end .Example Set-WinSchedule c:\windows\notepad.exe notepadtask .Parameter TaskRun The name of the command to be scheduled .Parameter ScheduleName The name that the scheduled task will be given. .Notes NAME: Set-Schedule AUTHOR: Tome Tanasovski LASTEDIT: 3/11/2010 KEYWORDS: .Link http://powertoe.wordpress.com #> param( [Parameter(Position=1,Mandatory=$true)] [string] $taskrun, [Parameter(Position=2,Mandatory=$true)] [string] $taskname ) $command = "& schtasks.exe /query /tn $taskname" $job = start-job $ExecutionContext.InvokeCommand.NewScriptBlock($command) Wait-Job $job if ($job.ChildJobs[0].output -ne "") { [System.windows.forms.messagebox]::show("A task named $taskname already exists. You must delete this task before you can use the name.") return } $SchedulePickerForm = New-Object System.Windows.Forms.Form $comboTime = New-Object System.Windows.Forms.ComboBox $label4 = New-Object System.Windows.Forms.Label $buttonCancel = New-Object System.Windows.Forms.Button $buttonOK = New-Object System.Windows.Forms.Button $group = New-Object System.Windows.Forms.GroupBox $checkSaturday = New-Object System.Windows.Forms.CheckBox $checkFriday = New-Object System.Windows.Forms.CheckBox $checkThursday = New-Object System.Windows.Forms.CheckBox $checkWednesday = New-Object System.Windows.Forms.CheckBox $checkTuesday = New-Object System.Windows.Forms.CheckBox $checkMonday = New-Object System.Windows.Forms.CheckBox $checkSunday = New-Object System.Windows.Forms.CheckBox $labelDays = New-Object System.Windows.Forms.Label $labelHours = New-Object System.Windows.Forms.Label $boxHourlyDaily = New-Object System.Windows.Forms.TextBox $labelEvery = New-Object System.Windows.Forms.Label $radioHourly = New-Object System.Windows.Forms.RadioButton $radioWeekly = New-Object System.Windows.Forms.RadioButton $radioDaily = New-Object System.Windows.Forms.RadioButton $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState $checkboxes = ($checkMonday,$checkTuesday,$checkWednesday,$checkThursday,$checkFriday,$checkSaturday,$checkSunday) function VisibleInvisibleCheckBoxes { Write-Host $checkboxes $checkboxes |foreach {$_.visible = -not $_.visible} } # Events $handler_radioButtonChanged = { switch ($true) { ($radioHourly.Checked) { $labelHours.Visible = $true $labelDays.Visible = $false $boxHourlyDaily.Visible = $true $checkboxes |foreach {$_.visible = $false} } ($radioDaily.Checked) { $labelHours.Visible = $false $labelDays.Visible = $true $boxHourlyDaily.Visible = $true $checkboxes |foreach {$_.visible = $false} } ($radioWeekly.Checked) { $labelHours.Visible = $false $labelDays.Visible = $false $boxHourlyDaily.Visible = $false $checkboxes |foreach {$_.visible = $true} } } } $buttonCancel_OnClick = { $SchedulePickerForm.Close() return $null } $buttonOK_OnClick = { $doit = $false switch ($true) { ($radioHourly.Checked -or $radioDaily.Checked) { try { $recurrence = [Convert]::ToInt32($boxHourlyDaily.Text) if ($recurrence -gt 0) { try { switch ($true) { ($radiohourly.checked) { if ($recurence -gt 23) { [System.windows.forms.messagebox]::show("Hourly recurrence must be 1-23 hours") $boxHourlyDaily.Focus() } else { & schtasks /create /tn $taskname /tr "$taskrun" /sc hourly /mo $boxHourlyDaily.Text /st $comboTime.Text /f [System.Windows.Forms.Messagebox]::show("Task has been scheduled") $SchedulePickerForm.Close() } } ($radioDaily.checked) { if ($recurence -gt 365) { [System.windows.forms.messagebox]::show("Hourly recurrence must be 1-365 hours") $boxhourlydaily.focus() } else { & schtasks /create /tn $taskname /tr $taskrun /sc daily /mo $boxHourlyDaily.Text /st $comboTime.Text /f $SchedulePickerForm.Close() } } } } catch { [System.windows.forms.messagebox]::show($error[0]) } } else { [System.windows.forms.messagebox]::show("Recurrence must be greater than 0") $boxHourlyDaily.Focus() } } catch { [System.windows.forms.messagebox]::show("You must enter a valid integer recurrence") $boxHourlyDaily.Focus() } } ($radioWeekly.Checked) { $dflag = "" $checkboxes|foreach { if ($_.checked) { $dflag += $_.text.substring(0,3) + "," } } if ($dflag -ne "") { $dflag = $dflag.substring(0,$dflag.length-1) & schtasks /create /tn $taskname /tr $taskrun /sc weekly /st $comboTime.Text /d "$dflag" /f $SchedulePickerForm.Close() } else { [System.windows.forms.messagebox]::show("You must select at least one day for weekly recurrence") } } } } $OnLoadForm_StateCorrection={ #Correct the initial state of the form to prevent the .Net maximized form issue $SchedulePickerForm.WindowState = $InitialFormWindowState } $SchedulePickerForm.Text = "Schedule Picker" $SchedulePickerForm.MaximizeBox = $False $SchedulePickerForm.Name = "SchedulePickerForm" $SchedulePickerForm.DataBindings.DefaultDataSourceUpdateMode = 0 $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 476 $System_Drawing_Size.Height = 157 $SchedulePickerForm.ClientSize = $System_Drawing_Size $SchedulePickerForm.FormBorderStyle = 5 $comboTime.FormattingEnabled = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 121 $System_Drawing_Size.Height = 21 $comboTime.Size = $System_Drawing_Size $comboTime.DataBindings.DefaultDataSourceUpdateMode = 0 $comboTime.Name = "comboTime" $comboTime.Items.Add("00:00")|Out-Null $comboTime.Items.Add("00:30")|Out-Null $comboTime.Items.Add("01:00")|Out-Null $comboTime.Items.Add("01:30")|Out-Null $comboTime.Items.Add("02:00")|Out-Null $comboTime.Items.Add("02:30")|Out-Null $comboTime.Items.Add("03:00")|Out-Null $comboTime.Items.Add("03:30")|Out-Null $comboTime.Items.Add("04:00")|Out-Null $comboTime.Items.Add("04:30")|Out-Null $comboTime.Items.Add("05:00")|Out-Null $comboTime.Items.Add("05:30")|Out-Null $comboTime.Items.Add("06:00")|Out-Null $comboTime.Items.Add("06:30")|Out-Null $comboTime.Items.Add("07:00")|Out-Null $comboTime.Items.Add("07:30")|Out-Null $comboTime.Items.Add("08:00")|Out-Null $comboTime.Items.Add("08:30")|Out-Null $comboTime.Items.Add("09:00")|Out-Null $comboTime.Items.Add("09:30")|Out-Null $comboTime.Items.Add("10:00")|Out-Null $comboTime.Items.Add("10:30")|Out-Null $comboTime.Items.Add("11:00")|Out-Null $comboTime.Items.Add("11:30")|Out-Null $comboTime.Items.Add("12:00")|Out-Null $comboTime.Items.Add("12:30")|Out-Null $comboTime.Items.Add("13:00")|Out-Null $comboTime.Items.Add("13:30")|Out-Null $comboTime.Items.Add("14:00")|Out-Null $comboTime.Items.Add("14:30")|Out-Null $comboTime.Items.Add("15:00")|Out-Null $comboTime.Items.Add("15:30")|Out-Null $comboTime.Items.Add("16:00")|Out-Null $comboTime.Items.Add("16:30")|Out-Null $comboTime.Items.Add("17:00")|Out-Null $comboTime.Items.Add("17:30")|Out-Null $comboTime.Items.Add("18:00")|Out-Null $comboTime.Items.Add("18:30")|Out-Null $comboTime.Items.Add("19:00")|Out-Null $comboTime.Items.Add("19:30")|Out-Null $comboTime.Items.Add("20:00")|Out-Null $comboTime.Items.Add("20:30")|Out-Null $comboTime.Items.Add("21:00")|Out-Null $comboTime.Items.Add("21:30")|Out-Null $comboTime.Items.Add("22:00")|Out-Null $comboTime.Items.Add("22:30")|Out-Null $comboTime.Items.Add("23:00")|Out-Null $comboTime.Items.Add("23:30")|Out-Null $comboTime.Text = "08:00" $comboTime.DropDownStyle = "DropDownList" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 53 $System_Drawing_Point.Y = 119 $comboTime.Location = $System_Drawing_Point $comboTime.TabIndex = 1 $SchedulePickerForm.Controls.Add($comboTime) $label4.TabIndex = 3 $label4.TextAlign = 16 $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 35 $System_Drawing_Size.Height = 23 $label4.Size = $System_Drawing_Size $label4.Text = "Start:" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 12 $System_Drawing_Point.Y = 116 $label4.Location = $System_Drawing_Point $label4.DataBindings.DefaultDataSourceUpdateMode = 0 $label4.Name = "label4" $SchedulePickerForm.Controls.Add($label4) $buttonCancel.TabIndex = 3 $buttonCancel.Name = "buttonCancel" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 75 $System_Drawing_Size.Height = 23 $buttonCancel.Size = $System_Drawing_Size $buttonCancel.UseVisualStyleBackColor = $True $buttonCancel.Text = "Cancel" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 368 $System_Drawing_Point.Y = 119 $buttonCancel.Location = $System_Drawing_Point $buttonCancel.DataBindings.DefaultDataSourceUpdateMode = 0 $buttonCancel.add_Click($buttonCancel_OnClick) $SchedulePickerForm.Controls.Add($buttonCancel) $buttonOK.TabIndex = 2 $buttonOK.Name = "buttonOK" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 75 $System_Drawing_Size.Height = 23 $buttonOK.Size = $System_Drawing_Size $buttonOK.UseVisualStyleBackColor = $True $buttonOK.Text = "OK" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 287 $System_Drawing_Point.Y = 119 $buttonOK.Location = $System_Drawing_Point $buttonOK.DataBindings.DefaultDataSourceUpdateMode = 0 $buttonOK.add_Click($buttonOK_OnClick) $SchedulePickerForm.Controls.Add($buttonOK) $group.Name = "group" $group.Text = "Recurrence pattern" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 431 $System_Drawing_Size.Height = 101 $group.Size = $System_Drawing_Size $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 12 $System_Drawing_Point.Y = 12 $group.Location = $System_Drawing_Point $group.TabStop = $False $group.TabIndex = 0 $group.DataBindings.DefaultDataSourceUpdateMode = 0 $SchedulePickerForm.Controls.Add($group) $checkSaturday.UseVisualStyleBackColor = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 73 $System_Drawing_Size.Height = 24 $checkSaturday.Size = $System_Drawing_Size $checkSaturday.TabIndex = 13 $checkSaturday.Text = "Saturday" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 274 $System_Drawing_Point.Y = 64 $checkSaturday.Location = $System_Drawing_Point $checkSaturday.DataBindings.DefaultDataSourceUpdateMode = 0 $checkSaturday.Name = "checkSaturday" $checkSaturday.Visible = $False $group.Controls.Add($checkSaturday) $checkFriday.UseVisualStyleBackColor = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 64 $System_Drawing_Size.Height = 24 $checkFriday.Size = $System_Drawing_Size $checkFriday.TabIndex = 12 $checkFriday.Text = "Friday" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 204 $System_Drawing_Point.Y = 64 $checkFriday.Location = $System_Drawing_Point $checkFriday.DataBindings.DefaultDataSourceUpdateMode = 0 $checkFriday.Name = "checkFriday" $checkFriday.Visible = $False $group.Controls.Add($checkFriday) $checkThursday.UseVisualStyleBackColor = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 70 $System_Drawing_Size.Height = 24 $checkThursday.Size = $System_Drawing_Size $checkThursday.TabIndex = 11 $checkThursday.Text = "Thursday" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 129 $System_Drawing_Point.Y = 64 $checkThursday.Location = $System_Drawing_Point $checkThursday.DataBindings.DefaultDataSourceUpdateMode = 0 $checkThursday.Name = "checkThursday" $checkThursday.Visible = $False $group.Controls.Add($checkThursday) $checkWednesday.UseVisualStyleBackColor = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 83 $System_Drawing_Size.Height = 24 $checkWednesday.Size = $System_Drawing_Size $checkWednesday.TabIndex = 10 $checkWednesday.Text = "Wednesday" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 342 $System_Drawing_Point.Y = 44 $checkWednesday.Location = $System_Drawing_Point $checkWednesday.DataBindings.DefaultDataSourceUpdateMode = 0 $checkWednesday.Name = "checkWednesday" $checkWednesday.Visible = $False $group.Controls.Add($checkWednesday) $checkTuesday.UseVisualStyleBackColor = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 68 $System_Drawing_Size.Height = 24 $checkTuesday.Size = $System_Drawing_Size $checkTuesday.TabIndex = 9 $checkTuesday.Text = "Tuesday" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 274 $System_Drawing_Point.Y = 44 $checkTuesday.Location = $System_Drawing_Point $checkTuesday.DataBindings.DefaultDataSourceUpdateMode = 0 $checkTuesday.Name = "checkTuesday" $checkTuesday.Visible = $False $group.Controls.Add($checkTuesday) $checkMonday.UseVisualStyleBackColor = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 64 $System_Drawing_Size.Height = 24 $checkMonday.Size = $System_Drawing_Size $checkMonday.TabIndex = 8 $checkMonday.Text = "Monday" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 204 $System_Drawing_Point.Y = 44 $checkMonday.Location = $System_Drawing_Point $checkMonday.DataBindings.DefaultDataSourceUpdateMode = 0 $checkMonday.Name = "checkMonday" $checkMonday.Visible = $False $group.Controls.Add($checkMonday) $checkSunday.UseVisualStyleBackColor = $True $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 104 $System_Drawing_Size.Height = 24 $checkSunday.Size = $System_Drawing_Size $checkSunday.TabIndex = 7 $checkSunday.Text = "Sunday" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 129 $System_Drawing_Point.Y = 44 $checkSunday.Location = $System_Drawing_Point $checkSunday.DataBindings.DefaultDataSourceUpdateMode = 0 $checkSunday.Name = "checkSunday" $checkSunday.Visible = $False $group.Controls.Add($checkSunday) $labelDays.TabIndex = 6 $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 64 $System_Drawing_Size.Height = 18 $labelDays.Size = $System_Drawing_Size $labelDays.Visible = $False $labelDays.Text = "day(s)" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 189 $System_Drawing_Point.Y = 23 $labelDays.Location = $System_Drawing_Point $labelDays.DataBindings.DefaultDataSourceUpdateMode = 0 $labelDays.Name = "labelDays" $group.Controls.Add($labelDays) $labelHours.TabIndex = 5 $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 100 $System_Drawing_Size.Height = 23 $labelHours.Size = $System_Drawing_Size $labelHours.Text = "hour(s)" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 189 $System_Drawing_Point.Y = 23 $labelHours.Location = $System_Drawing_Point $labelHours.DataBindings.DefaultDataSourceUpdateMode = 0 $labelHours.Name = "labelHours" $group.Controls.Add($labelHours) $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 28 $System_Drawing_Size.Height = 20 $boxHourlyDaily.Size = $System_Drawing_Size $boxHourlyDaily.DataBindings.DefaultDataSourceUpdateMode = 0 $boxHourlyDaily.Text = "1" $boxHourlyDaily.Name = "boxHourlyDaily" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 155 $System_Drawing_Point.Y = 20 $boxHourlyDaily.Location = $System_Drawing_Point $boxHourlyDaily.TabIndex = 4 $group.Controls.Add($boxHourlyDaily) $labelEvery.TabIndex = 3 $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 67 $System_Drawing_Size.Height = 23 $labelEvery.Size = $System_Drawing_Size $labelEvery.Text = "Every" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 116 $System_Drawing_Point.Y = 23 $labelEvery.Location = $System_Drawing_Point $labelEvery.DataBindings.DefaultDataSourceUpdateMode = 0 $labelEvery.Name = "labelEvery" $group.Controls.Add($labelEvery) $radioHourly.TabIndex = 0 $radioHourly.Name = "radioHourly" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 104 $System_Drawing_Size.Height = 24 $radioHourly.Size = $System_Drawing_Size $radioHourly.UseVisualStyleBackColor = $True $radioHourly.Text = "Hourly" $radioHourly.Checked = $True $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 6 $System_Drawing_Point.Y = 17 $radioHourly.Location = $System_Drawing_Point $radioHourly.DataBindings.DefaultDataSourceUpdateMode = 0 $radioHourly.TabStop = $True $radioHourly.add_Click($handler_radioButtonChanged) $group.Controls.Add($radioHourly) $radioWeekly.TabIndex = 2 $radioWeekly.Name = "radioWeekly" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 104 $System_Drawing_Size.Height = 24 $radioWeekly.Size = $System_Drawing_Size $radioWeekly.UseVisualStyleBackColor = $True $radioWeekly.Text = "Weekly" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 6 $System_Drawing_Point.Y = 56 $radioWeekly.Location = $System_Drawing_Point $radioWeekly.DataBindings.DefaultDataSourceUpdateMode = 0 $radioWeekly.add_Click($handler_radioButtonChanged) $group.Controls.Add($radioWeekly) $radioDaily.TabIndex = 1 $radioDaily.Name = "radioDaily" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 104 $System_Drawing_Size.Height = 24 $radioDaily.Size = $System_Drawing_Size $radioDaily.UseVisualStyleBackColor = $True $radioDaily.Text = "Daily" $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 6 $System_Drawing_Point.Y = 37 $radioDaily.Location = $System_Drawing_Point $radioDaily.DataBindings.DefaultDataSourceUpdateMode = 0 $radioDaily.add_Click($handler_radioButtonChanged) $group.Controls.Add($radioDaily) $SchedulePickerForm.CancelButton = $buttonCancel $SchedulePickerForm.AcceptButton = $buttonOK #Save the initial state of the form $InitialFormWindowState = $SchedulePickerForm.WindowState #Init the OnLoad event to correct the initial state of the form $SchedulePickerForm.add_Load($OnLoadForm_StateCorrection) #Show the Form $SchedulePickerForm.ShowDialog() |out-null }