Linux有stty -echo,它使輸入的內容不被回饋給用戶。
所以基本上你所輸入的內容在 shell 上是看不到的。
是否有辦法在powershell中做同樣的事情?
uj5u.com熱心網友回復:
事實證明,你的意圖是抑制通過stdin向PowerShell CLI提供的命令的回聲(powershell. Windows PowerShell使用 exe,PowerShell (Core) 7 使用pwsh):
為此,使用-Command - (-c -),它--像 -File - (-f -, 默認行為)--通過stdin逐一接受(獨立的)命令,但是--不像 -File ---既不列印一個提示字串,也不呼出提供的命令。
- 用
-Command -:
# OK。只是管道命令的*輸出*列印出來了。
PS> 'Get-Date' | powershell.exe -Command -
2021年9月3日,星期五,上午10:08:07
- 用
-File -:
# Pseudo-interactive behavior:
# piped命令的輸出是。
# *前面是*提示字串以及輸入命令。
# *后面是*另一個提示字串的渲染。
PS> 'Get-Date' | powershell.exe -File - Powered by Discuz!
PS C:Usersjdoe> Get-Date
2021年9月3日,星期五,上午10:09:44
PS C:Usersjdoe>
注意:在上面的例子中,通過stdin(通過管道)提供了一個single命令,由于沒有再提供stdin輸入,PowerShell行程退出。然而,在你保持stdin開放的情況下,你將能夠無限期地將命令--一個接一個地輸入到PowerShell行程中。
Caveat。 -File - 和 -Command - 表現出有問題的偽互動行為;特別是,跨越多行的命令必須以兩個換行符結束;詳情請參見GitHub 問題 #3223。
注意:
提供neither
-Command -或-File -基本上與-File -相同,只是在啟動時還會列印一個著作權資訊(可以通過-NoLogo單獨抑制);簡而言之:... | powershell -NoLogo與
相同。... | powershell -File -為了提供一個可預測的執行環境并避免額外的開銷,可以考慮在
-File/-Command前面加上-NoProfile,這樣可以繞過加載PowerShell的profile檔案。至于一般
stty -echo等價物(POSIX授權的stty工具在類似Unix的平臺上可用,在Windows上不行):- 這個命令是在終端上操作的,而不是碰巧在其中運行的shell。
- 一個POSIX兼容的shell,比如
bash,在發出這個命令后,不會嘗試將終端重置到之前的狀態,所以用戶輸入的資訊在會話結束前或終端重置前確實是不可見的。 - 相比之下,PowerShell(在類 Unix 平臺上運行的跨平臺 v7 版本)確實在運行每個命令后重置終端,因此運行
stty -echo實際上是一個無用功。 - 換句話說。你無法在PowerShell中實作同樣的效果,在任何平臺上(至少在PowerShell 7.2中)
在一個松散的相關說明中(由對問題意圖的誤讀所引發),以下討論了:
如何隱藏或者說如何使用這些功能?
如何隱藏或掩蓋通過Read-Host cmdlet 征求的互動用戶輸入:
沒有內置的PowerShell功能(截至v7.2)可以隱藏用戶輸入的內容,但是如果目的只是為了屏蔽用戶輸入,從而隱藏正在輸入的敏感資訊,例如密碼,你有兩個選擇--這兩個選擇都會屏蔽輸入的每個字符,而列印*:
使用Read-Host AsSecureString:
$$valueEnteredSecure = Read-Host -AsSecureString -Prompt 'enter your password'
注意,這將輸出一個System.Security.SecureString實體(在Windows上提供有限的安全性,而在類似Unix的平臺上幾乎沒有),你可以按以下方式將其轉換回一個普通字串:
$valueEntered = [System.Net.NetworkCredential]::new(''/span>, $valueEnteredSecure).Password
在PowerShell (Core) 7.0 中,你可以選擇使用(不過要注意下面更簡單的7.1 解決方案):
$valueEntered = ConvertFrom-SecureString $valueEnteredSecure -AsPlainText
PowerShell (Core) 7.1 現在支持一個-MaskInput引數,表現出相同的UI行為,但直接回傳一個常規字串:
# PowerShell 7.1
$valueEntered = Read-Host -MaskInput -Prompt 'Enter your password'。
如果真正的抑制用戶輸入的所有字符的顯示是必須的,你將不得不創建一個自定義的解決方案,在一個回圈中使用$host.ui.RawUI.ReadKey('NoEcho'):
這里有一個簡單的實作,你可以以
的方式呼叫它
$valueEntered = Read-HostSilent -Prompt 'Enter your password', 例如:
function Read-HostSilent {
param([string] $Prompt)
if ($Prompt) { Write-Host -NoNewline "${Prompt}: "/span> }
$entered = $null; $done = $false
do {
$key = $host.ui.RawUI.ReadKey('NoEcho'/span>)
switch ($key.VirtualKeyCode) {
# Backspaceif ($entered. Length -gt 1) { $entered = $entered.Substring(0, $entered.Length-1) } }
# 輸入。
13 { $done = $true; break }
默認 {
if ($key.Character) { # printable?
$entered = $key.Character
}
}
}
} while (-not $done)
$entered# output
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/320305.html
標籤:
下一篇:如何在按鈕被按下時做一個動作
