通过PSEXEC执行PowerShell菜单脚本时无限循环问题求助
问题解决:远程PowerShell脚本交互菜单无限循环(CMD干扰数据)
核心原因
通过PSEXEC或私有远程工具运行脚本时,工具的输入输出重定向会混入控制字符、空行或自身输出,这些干扰数据被Read-Host读取后,会触发Switch的Default分支,导致无限循环。
彻底解决方案
方案1:严格校验+清理输入,用循环确保有效选择
通过清理输入中的干扰字符(控制符、空白),并强制循环直到用户输入有效选项,从脚本层面过滤无效数据:
$validChoice = $false do { # 读取输入并清理:移除控制字符、首尾空白,统一转大写 $choix2 = (Read-Host "Faire un choix : O/N") -replace '[\p{C}\s]', '' | ForEach-Object { $_.ToUpper() } switch ($choix2) { 'O' { # 替换为你的O操作逻辑 Write-Host "执行O对应的操作" $validChoice = $true } 'N' { # 替换为你的N操作逻辑 Write-Host "执行N对应的操作" $validChoice = $true } default { Write-Host "无效选择,请输入O或N" $validChoice = $false } } } while (-not $validChoice)
方案2:直接捕获按键,绕过流干扰
使用[Console]::ReadKey()直接读取用户按键,不依赖Read-Host的流读取逻辑,彻底避免工具重定向带来的干扰:
Write-Host "Faire un choix : O/N" $validChoice = $false do { # 读取单个按键且不回显 $key = [Console]::ReadKey($true) $choix2 = $key.KeyChar.ToString().ToUpper() switch ($choix2) { 'O' { Write-Host "`n执行O对应的操作" $validChoice = $true } 'N' { Write-Host "`n执行N对应的操作" $validChoice = $true } default { Write-Host "`n无效选择,请输入O或N" $validChoice = $false } } } while (-not $validChoice)
方案3:调整PSEXEC参数,减少远程会话干扰
给PSEXEC添加-i参数,启动交互式远程会话,让PowerShell绑定真实控制台,减少流重定向的干扰:
psexec \\远程机器名 -i powershell -File "C:\脚本路径\你的脚本.ps1"
推荐组合
优先使用方案2+方案3:[Console]::ReadKey()从根源避免流干扰,配合PSEXEC的交互式参数,基本可以彻底消除循环问题。
内容的提问来源于stack exchange,提问作者Manios
相关产品推荐
相关产品推荐

