我在一個Powershell模塊中創建了一個非常簡單的函式,如果在很短的時間視窗內按下一個鍵,就應該捕獲一個按鍵。
function get-mycommand{
$count=0
$sleepTimer=2 #in milliseconds[/span
while ($count -le 100)
{
if($host.UI.RawUI.KeyAvailable) {
$key = $host.UI.RawUI.ReadKey('NoEcho, IncludeKeyDown')
return $key.character
} else {
$count
Write-Host $count $count
開始-睡眠 -m $sleepTimer
}
}
return "fail" }
}
function test-get-command{
$myvalue = get-mycommand
Write-Host 'return ' $myvalue = get-mycommand
}
只要我快速按下一個鍵,這就能正常作業。如果我不按下一個鍵,那么它將數到某個亂數字,通常小于20,然后停止更新。在我按下一個鍵之前,它不會做任何事情,也不會超時。當我按下一個鍵時,即使過了幾分鐘,它也會回傳,并顯示字符。我根本沒有看到 "失敗 "的訊息。
使用更長的定時器間隔并沒有改變任何東西。我已經嘗試了2、20和200的睡眠定時器。他們的行為都是一樣的。
uj5u.com熱心網友回復:
不幸的是,$host.UI.RawUI.KeyAvailable在Windows PowerShell以及PowerShell(Core)中,至少在v7.2.0-preview.9(截至本文寫作時的當前版本)中會出現假陽性。
在 Windows上,它似乎認為有一個可用的鍵,即使沒有,所以執行了$key = $host.UI.RawUI.ReadKey('NoEcho, IncludeKeyDown'),這將無限期地等待一個實際按鍵。
- 在常規控制臺視窗中,這種情況似乎最遲在幾個迭代之后就會發生。
- 在Windows終端中,它似乎一直發生在第一次迭代中,因此你的函式根本沒有輸出。
GitHub 問題 #959 似乎與此相關,盡管它與 PSReadLine 模塊有關。
- 在卸貨的程序中,我們發現了一個問題。
- 雖然卸載模塊(
Remove-Module PSReadLine)--你不會想在互動式會話中這樣做--在常規控制臺視窗中確實解決了這個問題,但在Windows Terminal中卻沒有幫助。
解決方法:
用[Console]::KeyAvailable替換$host.UI.RawUI.KeyAvailable
注意,這限制了對consoles(終端)的使用,但無論如何,你的原始代碼不會在過時的ISE中作業,因為$host.UI.RawUI.KeyAvailable在那里似乎從未報告一個待定的按鍵。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332619.html
標籤:
上一篇:如何擴展TextButton?
