2016-11-17 62 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和控制檯主機中顯示適當的是/否提示,並避免手動處理。