2017-09-27 7 views
0

私はいくつかのことを処理しているスクリプトを手に入れました。私は多くのことを知っている私は働いているより短いスクリプトを取得する必要があります。しかし、多くのファイルやスクリプトを扱うことができず、すべてを行うことができる1が必要な人が多く、600人にスクリプトが何をしているのかを伝えることはできません。私は少なくともいくつかの組み立ての種類が必要です。Powershell Codewrap for repeatオプションとバグフォーム

私はcanceldオプションの回避策を作りたかったのです。最も簡単な方法は、確実にすべてのコードをdo {} while()にラップすることです。しかし、私は単一のオプションを繰り返すことができるオプションはありますか?あなたが本当にキャンセルしたいと頼む時のような何か。

私が修正できない本当の迷惑なバグは、1回のアクションごとに開始フォームが再び立ち上がることです。私はカウンタでデバッグする方法を試しましたが、それはカウントアップしませんでした。また、他の場所で組み立てる関数を置いてみましたが、それを修正しませんでした。それがなぜ起こるのか分からない。 REPRO

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" 
} 
+1

'$ form.ShowDialog()'にしたくないときは '$ form.ShowDialog()'を使わないでください。 –

+0

しかし、$ form.ShowDialog()を使わないと、これらのウィンドウは開かないでしょう。 – Kevin

+0

もう一度やり直した後、私はあなたが何を意味しているのかを知っています。助言のためのよくthx – Kevin

答えて

0

ため

コード私はあなたがform eventsはなく.DialogResultで作業する必要があると思います。

Function Task { 
    #Choosed Option 
    $x = $listBox.SelectedItem 
    switch ($x) 
    { 
     #Option 1 working 
     "List Filter" 
     { 
      #Select path of the CSV 
      $csvpath = whichcsv 
      ... 
:あなたはおそらく機能であなたの OKタスクの大部分を入れて、同様のイベントからそれを呼び出すようにしたいと思う OKボタンについて $CancelButton.Add_Click({[Void]$Form.Window.Close()}) :あなたは、おそらくのような何かをするだろう Cancelボタンの (タスクが完了し、ダイアログを閉じます( [Void]$Form.Window.Close()))
$OkButton.Add_Click({Task}) 

+0

私に少しの例を教えてもらえますか?これらのイベントでこれまでに働いたことがないので、コード化する方法はわかりません。 – Kevin

+0

'$ CancelButton.Add_Click({[Void] $ Form.Window.Close()})'という小さな例です。これをフォームに追加し、キャンセルボタンをクリックして結果を確認します。そして、説明したように、OKボタンの場合は、すべてを関数に入れ、それをclickイベントに追加して関数を呼び出します。 '$ OkButton.Add_Click({Task})' – iRon

関連する問題