2017-03-17 4 views
0

私は動作していないpowershellスイッチを持っています。基本的に、選択内容にかかわらず、サブメニュー(ScanMenuとExport Menu)に進み、THENが他の機能を実行します。私は文を動かそうとしましたが、うまくいきません。誰かが私が間違っていることを見るためにどのような洞察力を持っていますか?Powershellスイッチが動作しない

#Module Import Section 

import-module ActiveDirectory 

#Global Variables 
$Title = "Audit Tool" 

#Variables for Menus 

$MainMenuMessage = "`nWhat would you like to do?" 
$MainMenuOptions = [System.Management.Automation.host.ChoiceDescription[]] @("&Scan Network", "&Check AD Health", "&Quit") 
$ScanMessage = "`nWhat would you like to scan for?" 
$ExportMessage = "`nWould you like to export these results to .CSV?" 
$ScanOptions = [System.Management.Automation.Host.ChoiceDescription[]] @("&Servers", "&Workstations", "&Quit") 
$ExportOptions = [System.Management.Automation.Host.ChoiceDescription[]] @("&Yes","&No") 
[int]$DefaultMainMenuChoice= 0 
[int]$DefaultScanChoice = 0 
[int]$DefaultExportChoice = 0 
$MainMenu = $host.UI.PromptForChoice($Title, $MainMenuMessage, $MainMenuOptions,$DefaultMainMenuChoice) 
$ScanMenu = $host.UI.PromptForChoice($Title , $ScanMessage, $ScanOptions,$DefaultScanChoice) 
$ExportMenu = $host.UI.PromptForChoice($Title, $ExportMessage, $ExportOptions,$DefaultExportChoice) 

#Menus Function 

switch($MainMenu){ 

    0 { switch($ScanMenu){ 
     0 { switch($ExportMenu){ 
        0 { Get-ADComputer -Filter {OperatingSystem -Like "Windows Server*"} -Property * | Export-CSV WindowsServer.csv -NoTypeInformation -Encoding UTF8} 
        1 { Get-ADComputer -Filter {OperatingSystem -Like "Windows Server*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -wrap -Auto} 
     1 { switch($ExportMenu){ 
        0 { Get-ADComputer -Filter {OperatingSystem -NotLike "Windows Server*"} -Property * | Export-CSV Workstations.csv -NoTypeInformation -Encoding UTF8} 
        1 { Get-ADComputer -Filter {OperatingSystem -NotLike "Windows Server*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -wrap -Auto} 
      } 
      } 


     } 
     } 
    } 
} 

1 { invoke-expression -Command .\ADScan.ps1} 
2 { invoke-expression -Command Exit} 

} 
+0

試し 'スイッチ([INT] $メインメニュー)'(使用して、すべてのスイッチ上のint) –

答えて

0

私はあなたの意図を理解していると思います。私が正しいとすれば、あなたはかなり閉じていました。 Switch内で$MainMenu,$ScanMenu、または$ExportMenuが呼び出されると、入力を求めるプロンプトが表示されるようです。代わりに、彼らはすべてすぐに呼び出されており、あなたの選択を無声で無視しているようです。それはまさに何が起こっているのかである。

ユーザーが定義:

$MainMenu = $host.UI.PromptForChoice($Title, $MainMenuMessage, $MainMenuOptions,$DefaultMainMenuChoice) 

を右クリックし、そこにその選択をするためにプロンプ​​トを表示し、$MainMenuに結果を保存しています。あなたがしたいことは、それがSwitchに到着するまで待ってから、その時点でプロンプトを出し、応答に応じて行動すると思います。あなたができることはスクリプトブロックとして定義しておき、準備ができたらプロンプトを表示するために後で呼び出すことです。それは次のようになります。

$MainMenu = {$host.UI.PromptForChoice($Title, $MainMenuMessage, $MainMenuOptions,$DefaultMainMenuChoice) } 

その後、後であなたは、彼らがやりたいことのために、ユーザに促すためにそのスクリプトブロックを呼び出すことができ、それに応じてケースを処理:

Switch($MainMenu.Invoke()){ 
    '0' {Switch($ScanMenu.Invoke()){...}} 
    '1' {& .\ADScan.ps1} 
    '2' {Break} 
} 
-1

を私はあなたを提供したいですこのカスタムGUI。

これは、コードスニペットと私が持っているテンプレートを使って作ったPowerShell GUIです。あなたがそれを好きだと思います。問題がある場合は私に知らせてください。

#Module Import 
import-module ActiveDirectory 

Add-Type -AssemblyName System.Windows.Forms 
function Test-Admin { 
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) 
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) 
} 
if ((Test-Admin) -eq $false) { 
    if ($elevated) 
    { 
     # tried to elevate, did not work, aborting 
    } 
    else { 
     Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition)) 
} 

exit 
} 

Function Param{ 
$Global:Option1Txt="Scan Network with CSV" 
$Global:Option2Txt="Scan Network without CSV" 
$Global:Option3Txt="Check AD Health" 

$Global:Option1_1Txt="Servers with CSV" 
$Global:Option2_1Txt="Workstations with CSV" 

$Global:Option1_2Txt="Servers without CSV" 
$Global:Option2_2Txt="Workstations without CSV" 
} 

Function AuditToolForm { 
    $Form.Close() 
    $Form.Dispose() 
    Test-Admin 
    MakeForm 
} 

Function Option1 { 
$Global:Option1btn.Visible = $False 
$Global:Option2btn.Visible = $False 
$Global:Option3btn.Visible = $False 
$Global:Option1_1btn.Visible = $True 
$Global:Option2_1btn.Visible = $True 
} 
Function Option1_1 { 
$Global:Option1_1 = Get-ADComputer -Filter {OperatingSystem -Like "Windows Server*"} -Property * | Export-CSV Workstations.csv -NoTypeInformation -Encoding UTF8 
} 
Function Option2_1 { 
$Global:Option2_1 = Get-ADComputer -Filter {OperatingSystem -NotLike "Windows Server*"} -Property * | Export-CSV Workstations.csv -NoTypeInformation -Encoding UTF8 
} 

Function Option2 { 
$Global:Option1btn.Visible = $False 
$Global:Option2btn.Visible = $False 
$Global:Option3btn.Visible = $False 
$Global:Option1_2btn.Visible = $True 
$Global:Option2_2btn.Visible = $True 
} 
Function Option1_2 { 
$Global:Option1_2 = Get-ADComputer -Filter {OperatingSystem -Like "Windows Server*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -wrap -Auto 
} 
Function Option2_2 { 
$Global:Option2_2 = Get-ADComputer -Filter {OperatingSystem -NotLike "Windows Server*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -wrap -Auto 
} 

Function Option3 { 
invoke-expression -Command .\ADScan.ps1 
} 

Function MakeForm { 
Param 

    $script:Form = New-Object system.Windows.Forms.Form 
    $Form.Text = "Audit Tool" 
    $Font = New-Object System.Drawing.Font("Times New Roman",12,[System.Drawing.FontStyle]::Bold) 
    $Form.Font = $Font 

    #Refresh/Reload 
    $Reloadbtn = New-Object System.Windows.Forms.Button 
    $Reloadbtn.Location = New-Object System.Drawing.Size(5,2) 
    $Reloadbtn.AutoSize = $true 
    $Reloadbtn.Text = "Main Menu" 
    $Reloadbtn.Add_Click({AuditToolForm}) 

    #Button Option1 
    $Global:Option1btn = New-Object System.Windows.Forms.Button 
    $Global:Option1btn.Location = New-Object System.Drawing.Size(5,60) 
    $Global:Option1btn.AutoSize = $true 
    $Global:Option1btn.Text = "$Global:Option1Txt" 
    $Global:Option1btn.Add_Click({Option1}) 


    #Button Option1_1 
    $Global:Option1_1btn = New-Object System.Windows.Forms.Button 
    $Global:Option1_1btn.Location = New-Object System.Drawing.Size(5,60) 
    $Global:Option1_1btn.AutoSize = $true 
    $Global:Option1_1btn.Text = "$Global:Option1_1Txt" 
    $Global:Option1_1btn.Add_Click({Option1_1}) 
    $Global:Option1_1btn.Visible = $False 

    #Button Option1_2 
    $Global:Option1_2btn = New-Object System.Windows.Forms.Button 
    $Global:Option1_2btn.Location = New-Object System.Drawing.Size(5,60) 
    $Global:Option1_2btn.AutoSize = $true 
    $Global:Option1_2btn.Text = "$Global:Option1_2Txt" 
    $Global:Option1_2btn.Add_Click({Option1_2}) 
    $Global:Option1_2btn.Visible = $False 

    #Button Option2 
    $Global:Option2btn = New-Object System.Windows.Forms.Button 
    $Global:Option2btn.Location = New-Object System.Drawing.Size(5,140) 
    $Global:Option2btn.AutoSize = $true 
    $Global:Option2btn.Text = "$Global:Option2Txt" 
    $Global:Option2btn.Add_Click({Option2}) 


    #Button Option2_1 
    $Global:Option2_1btn = New-Object System.Windows.Forms.Button 
    $Global:Option2_1btn.Location = New-Object System.Drawing.Size(5,140) 
    $Global:Option2_1btn.AutoSize = $true 
    $Global:Option2_1btn.Text = "$Global:Option2_1Txt" 
    $Global:Option2_1btn.Add_Click({Option2_1}) 
    $Global:Option2_1btn.Visible = $False 

    #Button Option2_2 
    $Global:Option2_2btn = New-Object System.Windows.Forms.Button 
    $Global:Option2_2btn.Location = New-Object System.Drawing.Size(5,140) 
    $Global:Option2_2btn.AutoSize = $true 
    $Global:Option2_2btn.Text = "$Global:Option2_2Txt" 
    $Global:Option2_2btn.Add_Click({Option2_2}) 
    $Global:Option2_2btn.Visible = $False 

    #Button Option3 
    $Global:Option3btn = New-Object System.Windows.Forms.Button 
    $Global:Option3btn.Location = New-Object System.Drawing.Size(150,2) 
    $Global:Option3btn.AutoSize = $true 
    $Global:Option3btn.Text = "$Global:Option3Txt" 
    $Global:Option3btn.Add_Click({Option3}) 

    #Form Controls 
    $Form.Controls.Add($Reloadbtn) 
    $Form.Controls.Add($Global:Option1btn) 
    $Form.Controls.Add($Global:Option1_1btn) 
    $Form.Controls.Add($Global:Option1_2btn) 
    $Form.Controls.Add($Global:Option2btn) 
    $Form.Controls.Add($Global:Option2_1btn) 
    $Form.Controls.Add($Global:Option2_2btn) 
    $Form.Controls.Add($Global:Option3btn) 
    $Form.ShowDialog() 
} 
Test-Admin 
MakeForm 
+0

Downvoted、それが与えられた理由の説明なし。これは、ソリューションを提供し、タスクを実行するための改善された方法も提供します。 –