【问题标题】:Powershell Script LoopingPowershell 脚本循环
【发布时间】:2021-11-22 12:14:08
【问题描述】:

我对这个脚本有一个问题,我似乎无法弄清楚。但是每次我运行我的 getfirewall 功能时,如果我在开始时按 Q 退出,它仍然会处理下一个关于我是否要启用或禁用它的问题。如果我在那里再次执行 Q,那么它会将我带到主菜单。然后在主菜单中,如果我再次按 q 退出,它会重复自己,让我再次输入 q 退出。

function GetFirewall
{
    $choice18 = read-host "Please enter the computer you wish you get the firewall profiles from"
   
    do{ try{$s1 = New-PSSession -ComputerName $choice18 -Credential domain.com\user
             $success = $true}
        catch{Write-Output "Wrong Password, Next attempt in 5 seconds"
              Start-sleep -Seconds 5}
        $count++
        }until($count -eq 5 -or $success)
        if(-not($success)){Mainmenu}


    $firewallP = icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}
    $firewallP
    write-host "Domain(1)"
    write-host "Private(2)"
    write-host "Public(3)"
    write-host "All(4)"
    write-host "Quit(Q)"
    $choice19 = Read-host "Which do you want to modify or exit"
        
    write-host "Enable(1)"
    write-host "Disable(2)"
    $choice20 = read-host "Do you want to Enable or Disable the profile?"    
 
    switch($choice19)
    {

        1{ 
           Switch($choice20)
           {
                1{
                    icm -session $s1 -scriptblock{Set-NetFirewallProfile -Name "Domain" -Enabled True}
                    icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}
                 }
                2{
                    icm -session $s1 -scriptblock{Set-NetFirewallProfile -Name "Domain" -Enabled false}
                    icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}
                 }
           }
         }
        2{
            Switch($choice20)
           {
                1{
                    icm -session $s1 -scriptblock{Set-NetFirewallProfile -Name "Private" -Enabled True}
                    icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}
                  }
                2{
                    icm -session $s1 -scriptblock{Set-NetFirewallProfile -Name "Private" -Enabled false}
                    icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}
                 }
           } }
        3{
            Switch($choice20)
           {
                1{
                    icm -session $s1 -scriptblock{Set-NetFirewallProfile -Name "Public" -Enabled True}
                    icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}
                }
                2{
                    icm -session $s1 -scriptblock{Set-NetFirewallProfile -Name "Public" -Enabled false}
                    icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}
                 }
           } 
         }
        4{
            switch($choice20)
            {
            1{ 
                icm -session $s1 -scriptblock{Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True}
                icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}}

            2{ 
                icm -session $s1 -scriptblock{Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False}
                icm -Session $s1 -scriptblock{Get-NetFirewallProfile -all |FT name, enabled}}
                   
            }
        }
        Q{Mainmenu}
    }
}
Function Mainmenu
{
Do {
    Write-Host "==========================="    
    Write-Host "        Main Menu          "
    Write-Host "==========================="    
    Write-Host "1: Active Directory Search"
    Write-Host "2: Service Administration"  
    Write-Host "3: Rename Remote PC"    
    Write-Host "4: Restart PC"
    Write-Host "5: Windows Update(Not Finished)"
    Write-Host "6: TestConnection"
    Write-Host "7: View Installed Apps(Almost Done)"
    Write-Host "8: View Firewall"
    Write-Host "Q: Quit"    
    Write-Host ''   
    $choice = Read-Host "Please select an option"   
    Switch ($choice) 
    {
        '1' 
        {       
            cls
            ActiveDirectoryInventory
        }
        '2' 
        {       
            cls
            Services
        }
        '3' 
        {
            cls
            RenamePC
        }
        '4' 
        {
            cls
            RestartPC
        }
        '5' 
        {
            cls
            WindowsUpdate
        }
        '6' 
        {
            cls
            Testconnect
        }
        '7'
        {
            cls
            GetApps
        }
        '8'
        {
            cls
            GetFirewall
        }
    }
}Until ($choice -eq 'Q')

}

【问题讨论】:

    标签: windows function powershell loops scripting


    【解决方案1】:

    你的GetFirewall函数被调用来自函数MainMenu

    因此,当用户按下Q 时,只需退出你的GetFirewall 函数,你就会返回到主菜单。

    因此,将Q{Mainmenu} 更改为:

    Q { return }
    

    注意:由于您的 switch 语句后面没有跟函数中的其他语句,Q { break } - 仅退出 switch 语句 - 也可以工作; return 立即退出整个函数。

    这种方法避免了调用堆栈膨胀,这是您当前方法所做的(MainMenu 调用 GetFirewall,它再次调用 MainMenu,...)并且还避免了返回到 MainMenu 调用的问题之前放在调用堆栈上。

    【讨论】:

    • 很好,谢谢!!困扰了我一段时间
    • @SteveG 如果您想在第一个问题之后额外“提前退出”,只需在 $choice19 = Read-Host ... 正下方的行中添加 if($choice19 -eq 'Q'){ return } 即可
    • 很高兴听到它有帮助,@SteveG;请允许我在下一条评论中给你标准的建议给新人:
    • 如果您accept 回答,您将通过向他们展示解决您的问题的方法来帮助未来的读者。要接受答案,请单击答案左侧大数字下方的大 ✓ 符号(您将获得 2 点声望)。如果您至少有 15 个声望点,您还可以投票给其他有用的答案(也可以选择接受的答案)。如果您的问题尚未解决,请提供反馈,或者,如果您自己找到了解决方案,请self-answer
    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2014-11-10
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多