【问题标题】:Powershell GUI, define variables per buttonPowershell GUI,为每个按钮定义变量
【发布时间】:2021-06-22 06:56:39
【问题描述】:

现在我为一个简单的过滤器脚本编写了一个 gui,这就是现在的整个脚本

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
   
$objForm = New-Object System.Windows.Forms.Form
$objForm.StartPosition = "CenterScreen"
$objForm.Size = New-Object System.Drawing.Size(1200,800)
$objForm.Text = "Test GUI"

$form = New-Object System.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(900,600)
$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Size=New-Object System.Drawing.Size(800,400)

#Filtern
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(30,10)
$OKButton.Size = New-Object System.Drawing.Size(300,92)
$OKButton.Text = "Filtern"
$OKButton.Name = "Filter"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::None
$OKButton.Add_Click({$i= 0
$path = "C:\temp\smtpfilter\LNS5filter.txt"
$length = (Get-Content $path).Length

#Datum, Hostname und Message Nummer
$result = Get-Content $path | ForEach-Object {
    if($_ -match '(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}).*\(((?:\d{1,3}\.){3}\d{1,3})\) disconnected\.?\s+(\d+) message\[s\]'){
        try {
            #$dns = [System.Net.Dns]::GetHostEntry($matches[2]).HostName
        }
        catch { 
            #$dns = 'Not available' 
        }
        [PsCustomObject]@{
            IP       = $matches[2]
            Messages = [int]$matches[3]
            #DNSName  = $dns
            Date     = [datetime]::ParseExact($matches[1], 'dd.MM.yyyy HH:mm:ss', $null)
        }}

        $i++
    if($i % 1000 -eq 0){
        Write-Progress -activity "Searching for matches" -status "Scanned: $i of $($length)" -percentComplete (($i / $length)  * 100)
    
 }}

 Write-Progress -activity "Searching for matches" -status "Scanned: $i of $($length)" -percentComplete (($i / $length)  * 100)

 #Messages Counted
 $cumulative = $result | Group-Object -Property IP | ForEach-Object {
    [PsCustomObject]@{
        IP = $_.Name
        Messages = ($_.Group | Measure-Object -Property Messages -Sum).Sum
        #DNSName = $_.Group[0].DNSName
        Date    = ($_.Group | Sort-Object Date)[-1].Date
    }
}})
$objForm.Controls.Add($OKButton)

#Ergebnis Anzeigen
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(30,112)
$OKButton.Size = New-Object System.Drawing.Size(300,92)
$OKButton.Text = "Ergebnis anzeigen"
$OKButton.Name = "Egebnis Button"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::None
$OKButton.Add_Click({$objTextBox1 = New-Object System.Windows.Forms.TextBox 
$objTextBox1.Multiline = $True;
$objTextBox1.Location = New-Object System.Drawing.Size(360,10) 
$objTextBox1.Size = New-Object System.Drawing.Size(800,600)
$objTextBox1.Text = $cumulative | Out-String
$objTextBox1.Font = "courier New, 13"
$objTextBox1.Scrollbars = "Vertical"
$objForm.Controls.Add($objTextBox1)
#outgridview
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(30,214)
$OKButton.Size = New-Object System.Drawing.Size(300,92)
$OKButton.Text = "Ergebnis in GridView"
$OKButton.Name = "GridView"
$OKButton.DialogResult = "OK"
$OKButton.Add_Click({$cumulative | Out-GridView})
$objForm.Controls.Add($OKButton)
#Export CSV
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(30,316)
$OKButton.Size = New-Object System.Drawing.Size(300,92)
$OKButton.Text = "Export CSV (in C:/temp)"
$OKButton.Name = "CSV"
$OKButton.DialogResult = "OK"
$OKButton.Add_Click({$cumulative | Export-Csv -Path 'C:\temp\SMTPresult.Csv'})
$objForm.Controls.Add($OKButton) })
$objForm.Controls.Add($OKButton) 

     [void] $objForm.ShowDialog()

第一个 $OKButton 基本上应该过滤 $path 中定义的 .txt 文件,然后在下部将结果一起计算,当我按下它时,进度条在 ISE 的后台启动,但我注意到那里没有结果保存在 $result 或 $cumulative 中。如果它比我想的更有效,我可以用下方的按钮显示结果。

我在这里错过了什么,我不能用按钮定义变量吗?

【问题讨论】:

  • 这可能是相同的根本原因 - stackoverflow.com/a/60046678/3156906。尝试将.GetNewClosure() 添加到事件处理程序脚本块的末尾,看看是否可以修复它 - 例如$OKButton.Add_Click({$cumulative | Out-GridView}.GetNewClosure())
  • @mclayton 我在 $cumulative = $result | 之后写了 .getnewClosure() Group-Object-Property IP | ForEach-Object { [PsCustomObject]@{ IP = $_.Name Messages = ($_.Group | Measure-Object -Property Messages -Sum).Sum #DNSName = $_.Group[0].DNSName Date = ($ _.Group | Sort-Object Date)[-1].Date } }} 遗憾的是它仍然不起作用,当我尝试导出它时,他告诉我 $cumulative 仍然是空的

标签: powershell user-interface variables


【解决方案1】:

对于任何可能遇到相同问题的人,我在尝试后得到了结果。问题是我的两个变量$result & $cummulative 的范围。由于它们是在 Button 中创建的,因此它们也仅在该 Button 中起作用。要在单击按钮后使用它们,我只需添加 $global:

所以最后看起来像

$OKButton.Add_Click({$i= 0
$length = (Get-Content $path).Length

#Datum, Hostname und Message Nummer
$global:result = Get-Content $path | ForEach-Object {
    if($_ -match '(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}).*\(((?:\d{1,3}\.){3}\d{1,3})\) disconnected\.?\s+(\d+) message\[s\]'){
        try {
            #$dns = [System.Net.Dns]::GetHostEntry($matches[2]).HostName
        }
        catch { 
            #$dns = 'Not available' 
        }
        [PsCustomObject]@{
            IP       = $matches[2]
            Messages = [int]$matches[3]
            #DNSName  = $dns
            Date     = [datetime]::ParseExact($matches[1], 'dd.MM.yyyy HH:mm:ss', $null)
        }}

        $i++
    if($i % 1000 -eq 0){
        Write-Progress -activity "Searching for matches" -status "Scanned: $i of $($length)" -percentComplete (($i / $length)  * 100)
    
 }}

 Write-Progress -activity "Searching for matches" -status "Scanned: $i of $($length)" -percentComplete (($i / $length)  * 100)

 #Messages Counted
 $global:cumulative = $result | Group-Object -Property IP | ForEach-Object {
    [PsCustomObject]@{
        IP = $_.Name
        Messages = ($_.Group | Measure-Object -Property Messages -Sum).Sum
        #DNSName = $_.Group[0].DNSName
        Date    = ($_.Group | Sort-Object Date)[-1].Date
    }
}})
$objForm.Controls.Add($OKButton)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多