添加新选项导致PowerShell菜单脚本出现问题
PowerShell菜单脚本添加选项异常的修复方案
作为IT支持人员,我自己拼凑了一个PowerShell菜单脚本辅助日常工作,目前还在学习熟练掌握PowerShell的读写,但遇到一个问题:在菜单末尾添加更多选项时总会出现异常,以下是我的原始脚本:
Function Menu { Clear-Host Do { Clear-Host Write-Host -Object 'Please choose an option' Write-Host -Object '**********************' Write-Host -Object 'Scripts to run' -ForegroundColor Yellow Write-Host -Object '**********************' Write-Host -Object '1. Ping PC ' Write-Host -Object '' Write-Host -Object '2. Restart ELP Desktops ' Write-Host -Object '' Write-Host -Object '3. Restart NOVI Desktops ' Write-Host -Object '' Write-Host -Object '4. Check PC Storage ' Write-Host -Object '' Write-Host -Object '5. Check all user adpw exp' Write-Host -Object '' Write-Host -Object 'Q. Quit' Write-Host -Object $errout $Menu = Read-Host -Prompt '(0-5 or Q to Quit)' switch ($Menu) { 1 { $Computer = Read-Host Please Enter Host name Get-WMIObject Win32_NetworkAdapterConfiguration -Computername $Computer | ` Where-Object {$_.IPEnabled -match "True"} | ` Select-Object -property DNSHostName,ServiceName,@{N="DNSServerSearchOrder"; E={"$($_.DNSServerSearchOrder)"}}, @{N='IPAddress';E={$_.IPAddress}}, @{N='DefaultIPGateway';E={$_.DefaultIPGateway}} | FT pause } 2 { restart-computer -ComputerName ##### -force } 3 { restart-computer -ComputerName ####-force } 4 { Invoke-Command -ComputerName (Read-Host -Prompt "Please Enter Host name") {Get-PSDrive | Where {$_.Free -gt 0}} pause } 5 { get-aduser -filter * -properties passwordlastset, passwordneverexpires |ft Name, passwordlastset, Passwordneverexpires pause } Q { Exit } default { $errout = 'Invalid option please try again........Try 0-5 or Q only' } } } until ($Menu -eq 'q') } # Launch The Menu Menu
问题根源分析
- 缩进混乱:PowerShell虽不强制要求缩进,但混乱的缩进会导致添加新选项时极易出现代码块未闭合的语法错误,原脚本中选项4、5的缩进与其他选项不一致,是新增选项出错的核心原因。
- 变量未初始化:
$errout变量未在函数开头初始化,首次运行时会显示空值,错误提示逻辑也存在重复触发的可能。 - 大小写不兼容:
until循环判断小写'q',但switch仅处理大写'Q',用户输入小写q会触发错误提示而非退出。 - 换行符使用错误:部分代码行末尾的反引号`后存在空格,PowerShell无法识别换行,引发语法错误。
修复后的脚本
Function Menu { # 初始化错误提示变量 $errout = '' Clear-Host Do { Clear-Host Write-Host 'Please choose an option' Write-Host '**********************' Write-Host 'Scripts to run' -ForegroundColor Yellow Write-Host '**********************' Write-Host '1. Ping PC ' Write-Host '' Write-Host '2. Restart ELP Desktops ' Write-Host '' Write-Host '3. Restart NOVI Desktops ' Write-Host '' Write-Host '4. Check PC Storage ' Write-Host '' Write-Host '5. Check all user adpw exp' Write-Host '' # 示例新增选项6 Write-Host '6. Example New Option ' Write-Host '' Write-Host 'Q/q. Quit' Write-Host $errout $Menu = Read-Host -Prompt '(1-6 or Q/q to Quit)' switch -Wildcard ($Menu.ToLower()) { '1' { $Computer = Read-Host 'Please Enter Host name' Get-WMIObject Win32_NetworkAdapterConfiguration -Computername $Computer | Where-Object {$_.IPEnabled -match "True"} | Select-Object -property DNSHostName,ServiceName, @{N="DNSServerSearchOrder";E={"$($_.DNSServerSearchOrder)"}}, @{N='IPAddress';E={$_.IPAddress}}, @{N='DefaultIPGateway';E={$_.DefaultIPGateway}} | Format-Table pause } '2' { Restart-Computer -ComputerName ##### -Force } '3' { Restart-Computer -ComputerName #### -Force } '4' { $targetPC = Read-Host -Prompt "Please Enter Host name" Invoke-Command -ComputerName $targetPC {Get-PSDrive | Where-Object {$_.Free -gt 0}} pause } '5' { Get-ADUser -Filter * -Properties PasswordLastSet, PasswordNeverExpires | Format-Table Name, PasswordLastSet, PasswordNeverExpires pause } '6' { # 这里添加新增选项的逻辑 Write-Host "执行新增选项6的操作" pause } 'q' { Exit } default { $errout = 'Invalid option please try again........Try 1-6 or Q/q only' } } } until ($Menu.ToLower() -eq 'q') } # 启动菜单 Menu
关键修改点说明
- 统一缩进:所有代码块使用4空格缩进,新增选项时保持相同缩进即可避免语法错误。
- 变量初始化:函数开头初始化
$errout = '',避免首次运行时的空值显示。 - 大小写兼容:通过
$Menu.ToLower()统一输入格式,确保Q或q都能触发退出逻辑。 - 优化换行:移除不必要的反引号,利用PowerShell管道自动换行特性,提升代码可读性并避免换行错误。
- 预留新增选项位置:添加示例选项6,展示规范的新增选项流程。
内容的提问来源于stack exchange,提问作者Hola_amigo06
相关产品推荐
相关产品推荐

