read-host 是 powershell 中最直接、轻量的交互式输入命令,适合本地手动运行,返回字符串或 securestring,需注意空输入处理、密码安全、非交互环境挂起及长度限制等陷阱。
在 powershell 基础脚本中,read-host 是最直接、轻量的交互式输入方式,适合本地手动运行的场景。它不依赖 gui 或外部模块,开箱即用,但需注意其行为细节和常见陷阱。
基础用法:捕获字符串输入
默认情况下,Read-Host 显示提示文字,用户输入后按回车,结果以普通字符串([string])形式返回:
-
$name = Read-Host "请输入姓名"→ 输入“张三”后,$name值为"张三" - 提示末尾自动添加英文冒号
:,无法禁用;如需自定义格式,可搭配Write-Host -NoNewline - 若用户直接按回车,返回空字符串
"",不是$null,需主动判断
安全输入:隐藏密码类敏感内容
对密码、密钥等不应明文出现在屏幕或内存中的数据,必须使用 -AsSecureString 或 -MaskInput 参数:
-
$pwd = Read-Host "输入密码" -AsSecureString→ 输入被星号遮盖,结果是SecureString对象,更安全 -
$pwdPlain = Read-Host "输入密码" -MaskInput→ 同样遮盖显示,但结果仍是普通字符串,仅防旁观者,不防内存泄露 - 避免将
SecureString转为明文;如确需校验(如两次输入比对),应使用[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR()并立即清空缓冲区
输入验证与容错处理
原生命令不带校验逻辑,需手动补充,否则易因空值、类型错误导致脚本中断:
- 检查空输入:
while ([string]::IsNullOrWhiteSpace($input)) { $input = Read-Host "此项不能为空" } - 验证数字格式:
if ($input -match '^\d+$') { $num = [int]$input } else { Write-Warning "请输入有效数字" } - 限制重试次数,避免无限循环;建议封装成函数,支持
-Validator脚本块和-RetryCount
注意事项与边界情况
实际使用中需避开几个典型误区:
- 在非交互环境(如 Azure DevOps Pipeline、计划任务)中调用
Read-Host会挂起或抛出OperationStoppedException,应预先检测$Host.UI.RawUI.KeyAvailable或改用参数传入 - 输入长度上限:PowerShell 5.1 中为 8190 字符,PowerShell 7+ 提升至约 65535 字符
- Ctrl+C 会中断输入并抛异常,生产脚本中建议用
try/catch捕获PipelineStoppedException










