2016-11-17 37 views
2

我有一个函数,当我的Powershell脚本中调用时插入Y或N菜单。它使用while循环来验证是否输入了Y或N值。一切工作正常,但每次发生错误时都会创建一个新行。我可以使用CLS并重新显示所有内容,但这不是最理想的解决方案。相反,我想找到一种方法在同一行重新显示读主机提示符,同时清除之前输入的答案。这里是我现有的代码:使用nonewline while while循环读取主机数据条目的PowerShell验证

# Begin function to display yes or no menu 
function ynmenu { 
    $global:ans = $null 
    Write-Host -ForegroundColor Cyan "`n Y. [Yes]" 
    Write-Host -ForegroundColor Cyan "N. [No]`n" 
    While ($ans -ne "y" -and $ans -ne "n"){ 
     $global:ans = Read-Host "Please select Y or N" 
    } 
} 
# End function ynmenu 

我有一些利用这种方法的其他动态填充菜单。找到解决方案也可以解决这个问题。

+0

要明确的是,当用户提供输入(回车或输入)时,如果不是“Y”或“N”,则您想保留在上面的行上。之前没有明显的条目? – gravity

+0

如果输入的内容不是“y”或“n”,包括输入或不输入,我希望提示重新显示在同一行上。它还需要清除以前的条目。例如,如果某人输入了“是”或“否”或其他任何内容,则它将无效。所以文本也需要清除。 –

+0

你不能够“移动”光标,或者像这样清除一条线(至少不容易 - 这是可能的,但是涉及到)。纯粹直观地实现你要求的最实用的方法是清除屏幕并重写提示和读取主机。请参阅[此问题](http://stackoverflow.com/questions/25846889/powershell-overwriting-line-written-with-write-host)以获取类似请求。否则,对于仅提示请求的一系列类似实现而言,您会过于复杂。 – gravity

回答

1

我不认为有任何简单的方法来做到这一点。

但是对于是/否的回复,只要您所在的范围(函数,脚本等)定义了属性[CmdletBinding(SupportsShouldProcess=$true)],您就可以使用$PSCmdlet.ShouldContinue($Query, $Caption)。这将在ISE和控制台主机中显示适当的是/否提示,并避免手动处理。