Forms Powershell代码包用于重复选项和带有表单的bug

Forms Powershell代码包用于重复选项和带有表单的bug,forms,powershell,Forms,Powershell,我有一个脚本正在处理一些事情。我知道很多人说我应该得到更多的短脚本,这是工作。但是有很多人不能处理很多文件或脚本,想要1个可以完成所有任务,我不能告诉600人哪个脚本做什么。我需要一种组装方式,至少有几种 我想为取消的选项做一个变通办法。最简单的方法是将所有代码包装在do{}while()中。但是,有没有什么方法可以让我重复一个方法呢?比如当它问你是否真的想取消时 我无法修复的一个真正恼人的错误是,在每一个动作之后,开始表单都会再次膨胀。我尝试了各种不同的方法来调试计数器,但它没有计数,而且我尝

我有一个脚本正在处理一些事情。我知道很多人说我应该得到更多的短脚本,这是工作。但是有很多人不能处理很多文件或脚本,想要1个可以完成所有任务,我不能告诉600人哪个脚本做什么。我需要一种组装方式,至少有几种

我想为取消的选项做一个变通办法。最简单的方法是将所有代码包装在
do{}while()
中。但是,有没有什么方法可以让我重复一个方法呢?比如当它问你是否真的想取消时

我无法修复的一个真正恼人的错误是,在每一个动作之后,开始表单都会再次膨胀。我尝试了各种不同的方法来调试计数器,但它没有计数,而且我尝试将函数组装到其他地方,但也没有解决它。我不知道为什么会这样

复制代码

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Set-PSDebug -Strict #Errorcall if a variable isnt declared

#Function Assembling

function Saveat()
{
    #working
    $Saveat = New-Object -Typename System.Windows.Forms.SaveFileDialog
    $Saveat.filter = "CSV (*.csv)| *.csv"
    #IF selection is canceld
    $result = $form.ShowDialog()
    [void]$Saveat.ShowDialog()
    return $Saveat.FileName
}

function Compare($location1, $location2)
{
    #work in progress   
    $CSV1 = Import-Csv -Path $location1 -UseCulture
    $CSV2 = Import-Csv -Path $location2 -UseCulture
    $Compared = Compare-Object -ReferenceObject $CSV1 -DifferenceObject $CSV2 |
                select -ExpandProperty inputObject |
                sort
    [void] $CSV1
    [void] $CSV2
    return $Compared
}

function whichcsv()
{
    #working
    $location = New-Object System.Windows.Forms.OpenFileDialog
    $location.Filter = "CSV (*.csv)| *.csv"
    $result = $form.ShowDialog()
    [void]$location.ShowDialog()
    return $location.FileName
}

#Select which option Form
#region Initiate Form  **This Form Blops up after every user action**

$form = New-Object System.Windows.Forms.Form 
$form.Text = "CSV Liste"
$form.Size = New-Object System.Drawing.Size(300,300) 
$form.StartPosition = "CenterScreen"

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(75,195)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(150,195)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20) 
$label.Size = New-Object System.Drawing.Size(280,20) 
$label.Text = "Welche CSV Liste soll geladen werden:"
$form.Controls.Add($label) 

$listBox = New-Object System.Windows.Forms.ListBox 
$listBox.Location = New-Object System.Drawing.Point(10,40) 
$listBox.Size = New-Object System.Drawing.Size(260,20) 
$listBox.Height = 150

[void] $listBox.Items.Add("List Filter")
[void] $listBox.Items.Add("ADComputer")
[void] $listBox.Items.Add("AS400 Personal Not implemented yet")
[void] $listBox.Items.Add("ADBenutzer Not implemented yet")
#endregion

$form.Controls.Add($listBox)
$form.Topmost = $true

$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    #Choosed Option
    $x = $listBox.SelectedItem
    switch ($x)
    {
        #Option 1 working
        "List Filter"
        {
            #Select path of the CSV
            $csvpath = whichcsv

            #IF selection is canceld
            if ($csvpath -eq "")
            {
                Write-Host "Operation Canceld"
            }
            else 
            {
                #CSV Import and Filter set                
                $CSV = Import-Csv -Path $csvpath -UseCulture
                $Filter = Read-Host "Please enter columname. Leave clear for cancel"
                if ($Filter -eq "")
                {
                    Write-Host "Operation canceld"                    
                }
                else
                {
                    $y = $CSV | Select $Filter
                    Write-Host "CSV Successfull Imported and Filter set"
                }

                $SDestination = Saveat
                if ($SDestination -eq "")
                {
                    Write-Host "Operation Canceld"                
                }
                else
                {
                    Write-Host "Process started"
                    foreach ($y1 in $y)
                    {
                        New-Object PSObject -Property @{Inventarnummer=$y1.$Filter} | Export-Csv $SDestination -NoTypeInformation -Append
                    }
                    Write-Host "Process finished"
                }
            }
        }

        #Option 2 working 
        "ADComputer" 
        {
            #Select path of the CSV
            $csvpath = whichcsv

            #IF selection is canceld
            if ($csvpath -eq "")
            {
                Write-Host "Operation Canceld"
            }
            else 
            {
                #CSV Import with filter
                $CSV = Import-Csv -Path $csvpath -Delimiter ',' 
                $Filter = Read-Host "Please enter columname. Leave clear for cancel"
                if ($Filter -eq "")
                {
                    Write-Host "Operation canceld"                    
                }
                else
                {
                    $y = $CSV | Select $Filter
                    Write-Host "CSV Successfull Imported and Filter set"
                }

                #Path selection
                $Saveworking = Saveat
                $SaveFailed = Saveat

                if($Saveworking -eq "")
                {
                    Write-Host "Operation canceld"
                }
                elseif ($SaveFailed -eq "")
                {
                    Write-Host "Operation canceld"
                }
                else
                {
                    #Progress
                    Write-Host "Process Start"
                    foreach($n in $y)
                    {
                        try 
                        {
                            $Computer = [system.net.dns]::resolve($n.$Filter) | Select HostName,AddressList
                            $IP = ($Computer.AddressList).IPAddressToString
                            Write-Host $n.$Filter $IP
                            New-Object PSObject -Property @{IPAddress=$IP; Name=$n.$Filter} | Export-Csv $Saveworking -NoTypeInformation -Append
                        } 
                        catch 
                        {
                            Write-Host "$($n.$Filter) is unreachable."
                            New-Object PSObject -Property @{Name=$n.$Filter} | Export-Csv $SaveFailed -NoTypeInformation -Append
                        }
                    }
                    Write-Host "Process successfull completed"
                }
            }
        }

        #Option 3 Not implemented yet
        "AS400 Personal Not implemented yet" 
        {
            Write-Host "Not implemented yet"
        }

        #Option 4 not implemented yet
        "ADBenutzer Not implemented yet" 
        {
            Write-Host "Not implemented yet"
        }  
    }
}
else
{
    Write-Host "Operation Canceld"
}

我想您需要使用而不是
。DialogResult
。 对于
取消
按钮,您可能会执行如下操作:
$CancelButton.Add\u单击({[Void]$Form.Window.Close()})
对于
OK
按钮,您可能希望将大部分
OK
任务放在函数中,并从类似事件调用它:

Function Task {
    #Choosed Option
    $x = $listBox.SelectedItem
    switch ($x)
    {
        #Option 1 working
        "List Filter"
        {
            #Select path of the CSV
            $csvpath = whichcsv
            ...


(并在任务完成后关闭对话框(
[Void]$Form.Window.close()

当您不想
$Form.ShowDialog()
时,请不要
$Form.ShowDialog()
。但是如果没有$Form.ShowDialog(),这些窗口将无法再次打开OK我明白了您的意思。。。我仍然在函数本身中保留了一些这种形式的显示。好的,谢谢你能给我举个例子吗?由于我从未处理过这些事件,我真的不知道如何对其进行编码
$CancelButton.Add\u Click({[Void]$Form.Window.Close()})
就是一个小例子。将其添加到表单中,然后单击“取消”按钮查看结果。如前所述,对于OK按钮,将所有内容放入函数中,并通过将其添加到click事件来调用该函数:
$OkButton.Add_click({Task})
$OkButton.Add_Click({Task})