在CMD中使用start /wait运行PowerShell选择脚本功能异常如何解决
问题解决方法
你遇到的问题和CMD无关,是PowerShell代码本身存在语法错误,加上调用方式的小问题导致的,具体修复方案如下:
1. 核心语法错误修复
你代码里的switch ('$result')使用了单引号包裹变量,PowerShell中单引号不会解析内部变量,相当于你一直在匹配字符串$result和数字0-5,永远匹配不上,自然不会执行对应逻辑。把单引号去掉,改成switch ($result)即可。
2. 脚本头调整
你开头的powershell.exe Set-ExecutionPolicy -ExecutionPolicy Bypass是多余的,而且会额外启动一个PowerShell进程,如果你是怕执行策略限制,可以在批处理调用PowerShell的时候直接加参数设置进程级的执行策略,不会影响系统全局配置。
3. 批处理调用方式修正
你不需要用start /wait,直接在批处理里调用PowerShell执行脚本就会自动等待运行结束,调用命令示例:
powershell.exe -ExecutionPolicy Bypass -File "你的脚本完整路径.ps1"
如果确实需要用start命令(比如要单独开窗口),可以改成:
start /wait powershell.exe -ExecutionPolicy Bypass -File "你的脚本完整路径.ps1"
修复后的完整PowerShell脚本代码
#Main Choice Script $IP = New-Object System.Management.Automation.Host.ChoiceDescription '&Edit IP', 'Change IP Address' $Intro= New-Object System.Management.Automation.Host.ChoiceDescription '&Change Introscreen', 'Change Introscreen' $Gecko = New-Object System.Management.Automation.Host.ChoiceDescription '&Replace Gecko', 'Change Gecko Folder' $PCName = New-Object System.Management.Automation.Host.ChoiceDescription '&Host Name', 'Fix Host Name' $Firewall = New-Object System.Management.Automation.Host.ChoiceDescription '&Firewall Settings', 'Fix Firewall Setting' $Close = New-Object System.Management.Automation.Host.ChoiceDescription '&Close', 'Exit' $options = [System.Management.Automation.Host.ChoiceDescription[]]($IP,$Intro,$Gecko,$PCName,$Firewall,$Close) $title = 'IT Tool' $message = 'What do you want to do?' $result = $host.ui.PromptForChoice($title, $message, $options,-1) switch ($result) { 0 { "IP" } 1 { "Intro" } 2 { "Gecko" } 3 { "PCName" } 4 { "Firewall" } 5 { "Close" } } # 如果你需要运行完对应逻辑后暂停看结果,可以取消下面这行注释 # Read-Host "Press enter to exit"
补充说明
$host.ui.PromptForChoice本身就支持纯文本交互,在CMD启动的PowerShell控制台里可以正常使用,不需要图形化环境,按选项前面高亮的字母或者对应数字都可以正常选择。
内容的提问来源于stack exchange,提问作者dweaver829
相关产品推荐
相关产品推荐

