2013-07-22 55 views
2

以下代碼將抓取一個目錄併爲每個目錄創建菜單項。它工作得很好,直到Add_Click部分;由於某種原因,無論點擊了哪個按鈕,它都會吐出相同的文件。錯誤的目錄數據輸出

$directory = Get-ChildItem -Path ($relative_path + "/scripts") 

foreach ($file in $directory) 
{ 
    $mnuTemp = New-Object System.Windows.Forms.MenuItem 
    $mnuTemp.Text = $file.Name 
    $mnuTemp.Add_Click({Write-Host $file.Name}) 
    $mnuScripts.MenuItems.Add($mnuTemp) 
} 
+0

是「同一個文件」是第一個在'$ directory'集合中的第一個,最後一個還是中間的任意一個?它總是一樣的,還是有所不同? – alroc

+0

它總是被掃描的最後一個。 – user1781652

+2

然後,您需要發佈更多腳本。這聽起來像'$ mnuScripts.MenuItems'只包含一個'MenuItem',並且該項目在每次foreach'迭代時被覆蓋,而不是追加到一個集合。你以某種方式抑制錯誤?對於'System.Windows.Forms.MenuItem'對象沒有'Add_Click'方法,我可以在[文檔]中看到(http://msdn.microsoft.com/zh-cn/library/system.windows.forms .menuitem.aspx) – alroc

回答

0

你還在傳遞一個參考$ file.name當你添加的點擊命令。

$mnuTemp.Add_Click({Write-Host $file.Name}) 

您需要將引用傳遞給完全評估的腳本塊。

$mnuTemp.Add_Click([scriptblock]::Create("write-host $($file.name)")) 

我修改了下面的修改代碼。

$directory = Get-ChildItem -Path ($relative_path + "/scripts") 

foreach ($file in $directory) 
{ 
    $mnuTemp = New-Object System.Windows.Forms.MenuItem 
    $mnuTemp.Text = $file.Name 
    $mnuTemp.Add_Click([scriptblock]::Create("write-host $($file.name)")) 
    $mnuScripts.MenuItems.Add($mnuTemp) 
}