2014-03-05 72 views
2

我試圖使用PowerShell腳本從http://technet.microsoft.com/en-us/library/ff730942.aspxPowerShell的日曆彈出

選擇日期和按下回車鍵後,變量$ dtmDate沒有數據。請幫忙。是否可以添加一個確定/取消按鈕?

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

$objForm = New-Object Windows.Forms.Form 

$objForm.Text = "Select a Date" 
$objForm.Size = New-Object Drawing.Size @(243,200) 
$objForm.StartPosition = "CenterScreen" 

$objForm.KeyPreview = $True 

$objForm.Add_KeyDown({ 
    if ($_.KeyCode -eq "Enter") 
     { 
      $dtmDate=$objCalendar.SelectionStart 
      $objForm.Close() 
     } 
    }) 

$objForm.Add_KeyDown({ 
    if ($_.KeyCode -eq "Escape") 
     { 
      $objForm.Close() 
     } 
    }) 

$objCalendar = New-Object System.Windows.Forms.MonthCalendar 
$objCalendar.ShowTodayCircle = $False 
$objCalendar.MaxSelectionCount = 1 
$objForm.Controls.Add($objCalendar) 

$objForm.Topmost = $True 

$objForm.Add_Shown({$objForm.Activate()}) 
[void] $objForm.ShowDialog() 

if ($dtmDate) 
    { 
     Write-Host "Date selected: $dtmDate" 
    } 
+0

嗯......該代碼在Powershell V2上運行得非常好 – Cole9350

回答

2

$dtmDate在你的if語句的上下文中沒有價值,因爲不被你的輸入按鍵執行的代碼......在Add_KeyDown背景下塊。嘗試執行這樣的事情,而不是:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

$dtmDate = $null 

# I've moved your Date printing logic into this function that can be called elsewhere. 
Function Do-Work 
{ 
    if ($dtmDate -ne $null) 
    { 
     Write-Host "Date selected: $dtmDate" 
    } 
} 

$objForm = New-Object Windows.Forms.Form 

$objForm.Text = "Select a Date" 
$objForm.Size = New-Object Drawing.Size @(243,200) 
$objForm.StartPosition = "CenterScreen" 

$objForm.KeyPreview = $True 

$objForm.Add_KeyDown({ 
    if ($_.KeyCode -eq "Enter") 
     { 
      $dtmDate = $objCalendar.SelectionStart   
      $objForm.Close() 

      Do-Work 
     } 
    }) 

$objForm.Add_KeyDown({ 
    if ($_.KeyCode -eq "Escape") 
     { 
      $objForm.Close() 
     } 
    }) 

$objCalendar = New-Object System.Windows.Forms.MonthCalendar 
$objCalendar.ShowTodayCircle = $False 
$objCalendar.MaxSelectionCount = 1 
$objForm.Controls.Add($objCalendar) 

$objForm.Topmost = $True 

$objForm.Add_Shown({$objForm.Activate()}) 
[void] $objForm.ShowDialog() 

新功能Do-Work定義的Add_KeyDown範圍之外,但由於我們沒有把它它會得到你的輸入按鍵執行。

0

û必須添加:

新變量dtmDate -Option AllScope

+0

歡迎。這個答案很短。請考慮解釋這將如何解決問題。 –

0
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

New-Variable dtmDate -Option AllScope 
$dtmDate = $null 

$objForm = New-Object Windows.Forms.Form 
$objForm.Text = "Select a Date" 
$objForm.Size = New-Object Drawing.Size @(190,190) 
$objForm.StartPosition = "CenterScreen" 
$objForm.KeyPreview = $True 

$objForm.Add_KeyDown(
    { 
    if ($_.KeyCode -eq "Enter") 
     { 
     $dtmDate=$objCalendar.SelectionStart 
     $objForm.Close() 
     } 
    }) 

$objForm.Add_KeyDown(
    { 
    if ($_.KeyCode -eq "Escape") {$objForm.Close()} 
    }) 

$objCalendar = New-Object System.Windows.Forms.MonthCalendar 
$objCalendar.ShowTodayCircle = $False 
$objCalendar.MaxSelectionCount = 1 
$objForm.Controls.Add($objCalendar) 
$objForm.Topmost = $True 
$objForm.Add_Shown({$objForm.Activate()}) 
[void] $objForm.ShowDialog() 

if ($dtmDate) {Write-Host "Date selected: $dtmDate" -ForegroundColor Green} 

線 「新變量dtmDate -Option AllScope」 允許變量的外部帶來表單範圍,因此您可以在腳本中進一步使用它。

我沒有爲寫主機創建一個函數。如果您想以正確的方式執行此操作,請創建整個腳本塊的功能。 上述腳本將以您希望的方式工作。它爲我工作!