# MiniScheduler3.ps1 - 8枠版(日本語UI / 繰り返し / 全自動設定 / 週末→月曜シフト / 実行後に最小化)
# ver15 変更点
# ・レイアウトを調整(列=オートサイズ、状態列のみ可変幅)→ 月コンボが見切れない
# ・「プログラム」列は LinkLabel(クリックで既定アプリ起動)。ツールチップにフルパス表示
# ・参照後はリンク表示名(ファイル名)を即時更新
# ・毎月◯日は “日” コンボの値を使用(全自動でも反映)
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[System.Windows.Forms.Application]::EnableVisualStyles()
# ===== 設定 =====
$TrayOnlyWhenMinimized = $true
$JobCount = 8
$StartMinimized = $false
# ===== パス・ログ =====
$AppDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$JobsPath = Join-Path $AppDir "jobs3.json"
$LogPath = Join-Path $AppDir "MiniScheduler3.log"
function Write-Log([string]$msg){ try{ Add-Content -Path $LogPath -Value ("{0} {1}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"),$msg) -Encoding UTF8 }catch{} }
# ===== 表示は日本語・内部コードは英語 =====
$RecurrenceItems = @(
@{ Text="なし"; Value="None" }
@{ Text="毎日"; Value="Daily" }
@{ Text="毎週"; Value="Weekly" }
@{ Text="毎月1日"; Value="Monthly1st" }
@{ Text="毎月◯日"; Value="MonthlyDay" }
)
function Init-RecurrenceCombo([System.Windows.Forms.ComboBox]$cb){
$cb.DropDownStyle="DropDownList"; $cb.DisplayMember="Text"; $cb.ValueMember="Value"
foreach($it in $RecurrenceItems){ [void]$cb.Items.Add( (New-Object PSObject -Property $it) ) }
}
function Set-ComboByValue([System.Windows.Forms.ComboBox]$cb,[string]$val){
foreach($item in $cb.Items){ if($item.Value -eq $val){ $cb.SelectedItem=$item; return } }
foreach($item in $cb.Items){ if($item.Value -eq "None"){ $cb.SelectedItem=$item; break } }
}
function Get-ComboValue([System.Windows.Forms.ComboBox]$cb){
if($cb.SelectedItem -and $cb.SelectedItem.PSObject.Properties.Match('Value').Count -gt 0){ return [string]$cb.SelectedItem.Value }
return "None"
}
# ===== タスクトレイ =====
$script:tray = New-Object System.Windows.Forms.NotifyIcon
$script:tray.Icon = [System.Drawing.SystemIcons]::Application
$script:tray.Text = "ミニスケジューラー"
$script:tray.Visible = (-not $TrayOnlyWhenMinimized)
$cms = New-Object System.Windows.Forms.ContextMenuStrip
$miOpen = $cms.Items.Add("開く")
$miExit = $cms.Items.Add("終了")
$script:tray.ContextMenuStrip = $cms
# ===== モデル =====
function New-EmptyJob{
[ordered]@{ Enabled=$false; Path=""; RunAt=(Get-Date); Recurrence="None"; DayOfMonth=1; LastRun=""; Status="" }
}
$Jobs = @(); 1..$JobCount | ForEach-Object { $Jobs += New-EmptyJob }
# --- 読込(RunAtはISO8601) ---
if(Test-Path $JobsPath){
try{
$loaded = Get-Content $JobsPath -Raw | ConvertFrom-Json
for($i=0;$i -lt [Math]::Min($JobCount,$loaded.Count);$i++){
$Jobs[$i] = $loaded[$i]
if($Jobs[$i].RunAt){
try{
if($Jobs[$i].RunAt -is [string]){ $Jobs[$i].RunAt = [datetime]::ParseExact($Jobs[$i].RunAt,"o",$null) }
}catch{ $Jobs[$i].RunAt = Get-Date }
} else { $Jobs[$i].RunAt = Get-Date }
if(-not $Jobs[$i].Recurrence){ $Jobs[$i].Recurrence="None" }
if(-not $Jobs[$i].DayOfMonth){ $Jobs[$i].DayOfMonth=1 }
}
}catch{ Write-Log "設定読込エラー: $($_.Exception.Message)" }
}
# --- 保存(RunAtはISO8601) ---
function Save-Jobs{
$arr = for($i=0;$i -lt $JobCount;$i++){
$j=$Jobs[$i]
New-Object psobject -Property ([ordered]@{
Enabled=[bool]$j.Enabled; Path=[string]$j.Path
RunAt=([datetime]$j.RunAt).ToString("o")
Recurrence=[string]$j.Recurrence; DayOfMonth=[int]$j.DayOfMonth
LastRun=[string]$j.LastRun; Status=[string]$j.Status
})
}
try{ ($arr|ConvertTo-Json -Depth 6) | Set-Content -Path $JobsPath -Encoding UTF8 }catch{ Write-Log "設定保存エラー: $($_.Exception.Message)" }
}
# ===== 日付計算(週末→月曜シフト対応) =====
function Get-EndOfMonth([datetime]$d){ (Get-Date -Year $d.Year -Month $d.Month -Day 1).AddMonths(1).AddDays(-1) }
function Shift-WeekendToMonday([datetime]$d){
switch([int]$d.DayOfWeek){
6 { return $d.AddDays(2) } # Sat -> Mon
0 { return $d.AddDays(1) } # Sun -> Mon
default { return $d }
}
}
function Get-NextOccurrence([string]$rule,[datetime]$runAt,[int]$day){
$now = Get-Date
$t = Get-Date -Hour $runAt.Hour -Minute $runAt.Minute -Second 0 -Millisecond 0
switch($rule){
"Daily" {
$c = Get-Date -Year $now.Year -Month $now.Month -Day $now.Day -Hour $t.Hour -Minute $t.Minute -Second 0
if($c -le $now){ $c = $c.AddDays(1) }
return (Shift-WeekendToMonday $c)
}
"Weekly" {
$target = [int]$runAt.DayOfWeek
$c = Get-Date -Year $now.Year -Month $now.Month -Day $now.Day -Hour $t.Hour -Minute $t.Minute -Second 0
while(([int]$c.DayOfWeek -ne $target) -or ($c -le $now)){ $c=$c.AddDays(1) }
return (Shift-WeekendToMonday $c)
}
"Monthly1st" {
$base = Get-Date -Year $now.Year -Month $now.Month -Day 1 -Hour $t.Hour -Minute $t.Minute -Second 0
$c = if($base -le $now){ $base.AddMonths(1) } else { $base }
return (Shift-WeekendToMonday $c)
}
"MonthlyDay" {
$d = [Math]::Min($day,(Get-EndOfMonth $now).Day)
$base = Get-Date -Year $now.Year -Month $now.Month -Day $d -Hour $t.Hour -Minute $t.Minute -Second 0
if($base -le $now){
$m = $now.AddMonths(1)
$d2 = [Math]::Min($day,(Get-EndOfMonth $m).Day)
$base = Get-Date -Year $m.Year -Month $m.Month -Day $d2 -Hour $t.Hour -Minute $t.Minute -Second 0
}
return (Shift-WeekendToMonday $base)
}
default { # None
$c = if($runAt -le $now){ $now.AddMinutes(1) } else { $runAt }
return (Shift-WeekendToMonday $c)
}
}
}
# ===== 共通:Y/M/D/H/M コンボから日時を作成 =====
function Build-DateTimeFromCombos($idx){
$y=[int]$cbYear[$idx].SelectedItem; $m=[int]$cbMonth[$idx].SelectedItem; $d=[int]$cbDay[$idx].SelectedItem
$H=[int]$cbHour[$idx].SelectedItem; $M=[int]$cbMinute[$idx].SelectedItem
if($y -lt 1){ $y=(Get-Date).Year }
if($m -lt 1 -or $m -gt 12){ $m=(Get-Date).Month }
$eom = (Get-Date -Year $y -Month $m -Day 1).AddMonths(1).AddDays(-1).Day
if($d -lt 1){ $d=1 }; if($d -gt $eom){ $d=$eom }
return (Get-Date -Year $y -Month $m -Day $d -Hour $H -Minute $M -Second 0)
}
function Update-DayOptions($idx){
$y=[int]$cbYear[$idx].SelectedItem; $m=[int]$cbMonth[$idx].SelectedItem
if($y -lt 1){ $y=(Get-Date).Year }; if($m -lt 1 -or $m -gt 12){ $m=(Get-Date).Month }
$eom=(Get-Date -Year $y -Month $m -Day 1).AddMonths(1).AddDays(-1).Day
$cur=[int]$cbDay[$idx].SelectedItem
$cbDay[$idx].Items.Clear(); 1..$eom | ForEach-Object { [void]$cbDay[$idx].Items.Add($_) }
if($cur -lt 1){ $cur=1 }; if($cur -gt $eom){ $cur=$eom }
$cbDay[$idx].SelectedItem=$cur
}
# ===== ファイル起動 =====
function Try-UnblockFile([string]$path){ try{ if(Test-Path -LiteralPath $path){ Unblock-File -LiteralPath $path -ErrorAction Stop } }catch{} }
function Invoke-Path([string]$p){
try{
Try-UnblockFile $p
$psi = New-Object System.Diagnostics.ProcessStartInfo
$psi.FileName = $p
$psi.UseShellExecute = $true
[System.Diagnostics.Process]::Start($psi) | Out-Null
return $true,""
} catch { return $false,$_.Exception.Message }
}
# ===== UI =====
$form = New-Object System.Windows.Forms.Form
$form.Text="ミニスケジューラー(8枠・1行レイアウト)ver15"
$form.StartPosition="CenterScreen"
$form.MinimumSize = New-Object System.Drawing.Size(1400,740)
$form.AutoScaleMode=[System.Windows.Forms.AutoScaleMode]::Dpi
$tbl = New-Object System.Windows.Forms.TableLayoutPanel
$tbl.Dock="Fill"; $tbl.ColumnCount=13
$tbl.Padding=New-Object System.Windows.Forms.Padding(8)
$tbl.AutoSize=$true; $tbl.AutoScroll=$true
# 0..11列は AutoSize、12列(状態)だけ Percent=100 で伸縮
for($c=0;$c -lt 12;$c++){ $tbl.ColumnStyles.Add((New-Object System.Windows.Forms.ColumnStyle([System.Windows.Forms.SizeType]::AutoSize))) }
$tbl.ColumnStyles.Add((New-Object System.Windows.Forms.ColumnStyle([System.Windows.Forms.SizeType]::Percent,100)))
# ヘッダー行
$headers = "#","プログラム","参照","有効","くり返し","年","月","日","時間","分","自動設定","今すぐ実行","状態"
for($c=0;$c -lt $headers.Count;$c++){
$h=New-Object System.Windows.Forms.Label
$h.Text=$headers[$c]; $h.AutoSize=$true; $h.Font=New-Object System.Drawing.Font($h.Font, [System.Drawing.FontStyle]::Bold)
$tbl.Controls.Add($h,$c,0)
}
# 配列
$lnkProg=@(); $btnBrowse=@(); $chkEnable=@(); $cbRule=@()
$cbYear=@(); $cbMonth=@(); $cbDay=@(); $cbHour=@(); $cbMinute=@()
$btnAuto=@(); $btnRunNow=@(); $lblStatus=@(); $txtPath=@()
$toolTip = New-Object System.Windows.Forms.ToolTip
# 表示名更新
function UpdateProgramLinkText([int]$idx){
$p = [string]$txtPath[$idx].Text
if([string]::IsNullOrWhiteSpace($p)){ $lnkProg[$idx].Text = "(未設定)"; $toolTip.SetToolTip($lnkProg[$idx],"パス未設定"); return }
try{
$name = Split-Path -Leaf $p
$lnkProg[$idx].Text = $name
$toolTip.SetToolTip($lnkProg[$idx], $p)
}catch{
$lnkProg[$idx].Text = $p
$toolTip.SetToolTip($lnkProg[$idx], $p)
}
}
# 行作成
for($i=0;$i -lt $JobCount;$i++){
$r = $i+1
$tbl.RowStyles.Add((New-Object System.Windows.Forms.RowStyle([System.Windows.Forms.SizeType]::AutoSize)))
# 0: #
$labIndex = New-Object System.Windows.Forms.Label; $labIndex.Text=("{0}" -f ($i+1)); $labIndex.AutoSize=$true
$tbl.Controls.Add($labIndex,0,$r)
# 1: プログラム(リンク表示) & 隠しTextBoxに実パス保持
$lnk = New-Object System.Windows.Forms.LinkLabel
$lnk.Text="(未設定)"; $lnk.AutoSize=$true
$tbl.Controls.Add($lnk,1,$r); $lnkProg+=$lnk
$path=New-Object System.Windows.Forms.TextBox; $path.Visible=$false; $txtPath += $path
# 2: 参照
$b=New-Object System.Windows.Forms.Button; $b.Text="参照"; $b.Width=60
$tbl.Controls.Add($b,2,$r); $btnBrowse+=$b
# 3: 有効
$chk=New-Object System.Windows.Forms.CheckBox; $chk.Text=""; $chk.Width=20
$tbl.Controls.Add($chk,3,$r); $chkEnable+=$chk
# 4: くり返し
$rc=New-Object System.Windows.Forms.ComboBox; $rc.Width=90; $rc.DropDownStyle='DropDownList'; Init-RecurrenceCombo $rc
$tbl.Controls.Add($rc,4,$r); $cbRule+=$rc
# 5..9: 年 月 日 時 分(すべて DropDownList)
$yy=New-Object System.Windows.Forms.ComboBox; $yy.Width=70; $yy.DropDownStyle='DropDownList'
$mm=New-Object System.Windows.Forms.ComboBox; $mm.Width=70; $mm.DropDownStyle='DropDownList'
$dd=New-Object System.Windows.Forms.ComboBox; $dd.Width=70; $dd.DropDownStyle='DropDownList'
$HH=New-Object System.Windows.Forms.ComboBox; $HH.Width=75; $HH.DropDownStyle='DropDownList'
$MN=New-Object System.Windows.Forms.ComboBox; $MN.Width=75; $MN.DropDownStyle='DropDownList'
$tbl.Controls.Add($yy,5,$r); $cbYear+=$yy
$tbl.Controls.Add($mm,6,$r); $cbMonth+=$mm
$tbl.Controls.Add($dd,7,$r); $cbDay+=$dd
$tbl.Controls.Add($HH,8,$r); $cbHour+=$HH
$tbl.Controls.Add($MN,9,$r); $cbMinute+=$MN
# 10: 自動設定
$ba=New-Object System.Windows.Forms.Button; $ba.Text="自動設定"; $ba.Width=80
$tbl.Controls.Add($ba,10,$r); $btnAuto+=$ba
# 11: 今すぐ実行
$bn=New-Object System.Windows.Forms.Button; $bn.Text="今すぐ実行"; $bn.Width=90
$tbl.Controls.Add($bn,11,$r); $btnRunNow+=$bn
# 12: 状態
$st=New-Object System.Windows.Forms.Label; $st.AutoSize=$true
$tbl.Controls.Add($st,12,$r); $lblStatus+=$st
}
# 下部:全自動/保存/終了
$footerRow = $JobCount + 1
$tbl.RowStyles.Add((New-Object System.Windows.Forms.RowStyle([System.Windows.Forms.SizeType]::AutoSize)))
$btnAutoAll = New-Object System.Windows.Forms.Button; $btnAutoAll.Text="全てを自動設定"; $btnAutoAll.Width=130
$btnSave = New-Object System.Windows.Forms.Button; $btnSave.Text="保存"
$btnExit = New-Object System.Windows.Forms.Button; $btnExit.Text="終了"
$pnl=New-Object System.Windows.Forms.FlowLayoutPanel; $pnl.FlowDirection='LeftToRight'; $pnl.AutoSize=$true
$pnl.Controls.Add($btnAutoAll); $pnl.Controls.Add($btnSave); $pnl.Controls.Add($btnExit)
$tbl.Controls.Add($pnl,0,$footerRow); $tbl.SetColumnSpan($pnl,13)
$form.Controls.Add($tbl)
# ===== トレイ格納関数 =====
function Minimize-ToTray {
$form.WindowState='Minimized'; $form.ShowInTaskbar=$false; $script:tray.Visible=$true
}
$restore = {
$form.WindowState='Normal'; $form.ShowInTaskbar=$true
if($TrayOnlyWhenMinimized){ $script:tray.Visible=$false }
$form.Activate()
}
$miOpen.add_Click($restore)
$script:tray.add_DoubleClick($restore)
$miExit.add_Click({ $script:tray.Visible=$false; $script:tray.Dispose(); $form.Close() })
# ===== コンボ初期化 =====
function Init-YMHm-Combos($idx,[datetime]$seed){
# 年:seed.Year-1 ~ seed.Year+2
$cbYear[$idx].Items.Clear(); ($seed.Year-1)..($seed.Year+2) | ForEach-Object { [void]$cbYear[$idx].Items.Add($_) }
if(-not $cbYear[$idx].Items.Contains($seed.Year)){ [void]$cbYear[$idx].Items.Add($seed.Year) }
$cbYear[$idx].SelectedItem=$seed.Year
# 月
$cbMonth[$idx].Items.Clear(); 1..12 | ForEach-Object {[void]$cbMonth[$idx].Items.Add($_)}
$cbMonth[$idx].SelectedItem=$seed.Month
# 日
$cbDay[$idx].Items.Clear()
$eom=(Get-Date -Year $seed.Year -Month $seed.Month -Day 1).AddMonths(1).AddDays(-1).Day
1..$eom | ForEach-Object {[void]$cbDay[$idx].Items.Add($_)}
$cbDay[$idx].SelectedItem=[Math]::Min($seed.Day,$eom)
# 時間
$cbHour[$idx].Items.Clear(); 0..23 | ForEach-Object {[void]$cbHour[$idx].Items.Add($_)}
$cbHour[$idx].SelectedItem=$seed.Hour
# 分
$cbMinute[$idx].Items.Clear(); 0..59 | ForEach-Object {[void]$cbMinute[$idx].Items.Add($_)}
$cbMinute[$idx].SelectedItem=$seed.Minute
# 年・月変更で日数貼り替え
$cbYear[$idx].add_SelectedIndexChanged({ Update-DayOptions $idx })
$cbMonth[$idx].add_SelectedIndexChanged({ Update-DayOptions $idx })
}
# ===== 既存値→UI =====
for($i=0;$i -lt $JobCount;$i++){
$txtPath[$i].Text=[string]$Jobs[$i].Path
UpdateProgramLinkText $i
$chkEnable[$i].Checked=[bool]$Jobs[$i].Enabled
$lblStatus[$i].Text=[string]$Jobs[$i].Status
Init-RecurrenceCombo $cbRule[$i]; Set-ComboByValue $cbRule[$i] ([string]$Jobs[$i].Recurrence)
Init-YMHm-Combos $i ([datetime]$Jobs[$i].RunAt)
if($Jobs[$i].DayOfMonth){ $cbDay[$i].SelectedItem = [Math]::Min([int]$Jobs[$i].DayOfMonth, [int]$cbDay[$i].Items[$cbDay[$i].Items.Count-1]) }
}
# ===== イベント:プログラムリンク & 参照 =====
for($i=0;$i -lt $JobCount;$i++){
$lnkProg[$i].Tag = $i
$lnkProg[$i].add_LinkClicked({
param($s,$e)
$idx=[int]$s.Tag
$p=[string]$txtPath[$idx].Text
if([string]::IsNullOrWhiteSpace($p)){
# 未設定なら参照ダイアログ
$ofd=New-Object System.Windows.Forms.OpenFileDialog
$ofd.Filter="すべてのファイル|*.*"
if($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
$txtPath[$idx].Text=$ofd.FileName; UpdateProgramLinkText $idx
}
return
}
$ok,$err=Invoke-Path $p
if(-not $ok){ [System.Windows.Forms.MessageBox]::Show("起動エラー:`n"+$err)|Out-Null }
})
}
for($i=0;$i -lt $JobCount;$i++){
$btnBrowse[$i].Tag=$i
$btnBrowse[$i].Add_Click({
param($s,$e)
$i=[int]$s.Tag
$ofd=New-Object System.Windows.Forms.OpenFileDialog
$ofd.Filter="すべてのファイル|*.*"
if($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
$txtPath[$i].Text=$ofd.FileName
UpdateProgramLinkText $i
}
})
}
# ===== 自動設定(1枠) =====
function Apply-Auto([int]$idx){
$base = Build-DateTimeFromCombos $idx
$daySel = [int]$cbDay[$idx].SelectedItem
$rule = Get-ComboValue $cbRule[$idx]
$next = Get-NextOccurrence $rule $base $daySel
$Jobs[$idx].RunAt=$next
$Jobs[$idx].Recurrence=$rule
$Jobs[$idx].DayOfMonth=$daySel
$Jobs[$idx].Status="次回: "+$next.ToString("yyyy/MM/dd HH:mm")
$lblStatus[$idx].Text=$Jobs[$idx].Status
Init-YMHm-Combos $idx $next
}
# ===== 今すぐ実行 / 自動設定 / 全自動 =====
for($i=0;$i -lt $JobCount;$i++){
$btnRunNow[$i].Tag=$i; $btnAuto[$i].Tag=$i
}
foreach($b in $btnRunNow){
$b.Add_Click({
param($s,$e)
$i=[int]$s.Tag; $p=$txtPath[$i].Text
if([string]::IsNullOrWhiteSpace($p)){ [System.Windows.Forms.MessageBox]::Show("パスを選択してください。")|Out-Null; return }
$ok,$err=Invoke-Path $p
$Jobs[$i].LastRun=(Get-Date).ToString("yyyy/MM/dd HH:mm")
if($ok){
if($Jobs[$i].Recurrence -eq "None"){
$Jobs[$i].Status="実行完了"; $Jobs[$i].Enabled=$false; $chkEnable[$i].Checked=$false
} else {
$base = Build-DateTimeFromCombos $i
$next = Get-NextOccurrence $Jobs[$i].Recurrence $base ([int]$cbDay[$i].SelectedItem)
$Jobs[$i].RunAt=$next
$Jobs[$i].Status="実行完了 → 次回: "+$next.ToString("yyyy/MM/dd HH:mm")
Init-YMHm-Combos $i $next
}
} else { [System.Windows.Forms.MessageBox]::Show("実行エラー:`n"+$err)|Out-Null; $Jobs[$i].Status="実行エラー" }
Save-Jobs; $lblStatus[$i].Text=$Jobs[$i].Status
Minimize-ToTray
})
}
foreach($b in $btnAuto){
$b.Add_Click({
param($s,$e)
$i=[int]$s.Tag
Apply-Auto $i
Save-Jobs
[System.Windows.Forms.MessageBox]::Show("プログラム{0} を {1} に設定しました。".Replace("{0}",($i+1)).Replace("{1}",$Jobs[$i].RunAt.ToString("yyyy/MM/dd HH:mm"))) | Out-Null
})
}
$btnAutoAll.Add_Click({
for($i=0;$i -lt $JobCount;$i++){ Apply-Auto $i }
Save-Jobs
[System.Windows.Forms.MessageBox]::Show(("{0}件すべてのスケジュールを自動設定しました。(土日は月曜へシフト)" -f $JobCount))|Out-Null
})
# ===== 保存・終了 =====
$btnSave.Add_Click({
for($i=0;$i -lt $JobCount;$i++){
$Jobs[$i].Path = $txtPath[$i].Text
$Jobs[$i].Enabled = $chkEnable[$i].Checked
$Jobs[$i].RunAt = Build-DateTimeFromCombos $i
$Jobs[$i].Recurrence= Get-ComboValue $cbRule[$i]
$Jobs[$i].DayOfMonth= [int]$cbDay[$i].SelectedItem
}
Save-Jobs
[System.Windows.Forms.MessageBox]::Show("保存しました。")|Out-Null
})
$btnExit.Add_Click({ $script:tray.Visible=$false; $script:tray.Dispose(); $form.Close() })
# ===== タイマー(1秒)=====
$timer=New-Object System.Windows.Forms.Timer; $timer.Interval=1000
$timer.Add_Tick({
$now=Get-Date
for($i=0;$i -lt $JobCount;$i++){
if(-not $Jobs[$i].Enabled){ continue }
if($now -ge [datetime]$Jobs[$i].RunAt){
$p=[string]$Jobs[$i].Path
if([string]::IsNullOrWhiteSpace($p)){
$Jobs[$i].Status="パス未設定"; $Jobs[$i].Enabled=$false; $chkEnable[$i].Checked=$false; Save-Jobs; $lblStatus[$i].Text=$Jobs[$i].Status; continue
}
$ok,$err=Invoke-Path $p
$Jobs[$i].LastRun=(Get-Date).ToString("yyyy/MM/dd HH:mm")
if($ok){
if($Jobs[$i].Recurrence -eq "None"){
$Jobs[$i].Status="実行完了"; $Jobs[$i].Enabled=$false; $chkEnable[$i].Checked=$false
} else {
$base = Build-DateTimeFromCombos $i
$next = Get-NextOccurrence $Jobs[$i].Recurrence $base ([int]$cbDay[$i].SelectedItem)
$Jobs[$i].RunAt=$next
$Jobs[$i].Status="実行完了 → 次回: "+$next.ToString("yyyy/MM/dd HH:mm")
Init-YMHm-Combos $i $next
}
} else { $Jobs[$i].Status="実行エラー" }
Save-Jobs; $lblStatus[$i].Text=$Jobs[$i].Status
Minimize-ToTray
}
}
})
$timer.Start()
# ===== 起動時の動作 =====
if($StartMinimized){ $form.Add_Shown({ Minimize-ToTray }) }
# ===== 表示 =====
[System.Windows.Forms.Application]::Run($form)
目次
コメント