------ [第二章 从 [撸串.ps1 ] 开始学习编写 [ powershell 的参数补全] ] ------
问:powershell 的参数补全分哪几种?
答:
分参数 [名] 补全,和参数 [值] 补全。
比如:
撸串.ps1 -吃几串 10
-吃几串 是 [参数名]
10 是参数值
问:powershell 的 [参数名] 补全,是否需要写脚本?
答:
不需要。
例子:
-------a.ps1 开始-------
param
(
$君不见黄河之水天上来_飞流直下 3333 千尺
)
echo $君不见黄河之水天上来_飞流直下 3333 千尺
-------a.ps1 结束-------
运行:
./a.ps1 -<打 tab>
即可出现:
./a.ps1 -君不见黄河之水天上来_飞流直下 3333 千尺
问:powershell 的 [参数值] 补全,是否需要写脚本?
答:
参数值是用户输入的,基本上是无法补全的,能补全的只有两种特例。
1 补全所有枚举。比如参数名是 [-今天是周几] ,那么只有 7 种选择。
2 补全部分常用的枚举。比如参数名是 [-吃几串] ,而输入值是一个数字,
那么常用的输入值只有:1,10,12。剩下不常用的 2----21 亿。不需要补全,让用户自己输入。
问:powershell 的 [参数值] 补全,如何补全 [所有枚举] ?
答:
-------星期.ps1 开始-------
param
(
[ValidateSet('周 1','周 2','周 3','周 4','周 5','周 6','周日')]$今天是周几
)
echo $今天是周几
-------星期.ps1 结束-------
使用:
星期.ps1 -<tab>或 shift<tab> 补全
问:powershell 的 [参数值] 补全,如何补全 [部分常用的枚举] ?
答:
可以一次吃 1 串,10 串,12 串。也可以不用补全,手动输入 99999 串。
-------撸串.ps1 开始-------
param
(
[ArgumentCompleter({1,10,12})]$一次吃几串
)
echo $一次吃几串
-------撸串.ps1 结束-------
使用:
撸串.ps1 -<tab>或 shift<tab> 补全
问:如何给没有 [参数值补全] 的 ps 命令,添加补全?
答:
假设我们想要补全 [特定的邮箱账户列表] 。或 [计算机名列表] 。
例子目的:给 ps 命令 [ Invoke-Command ] 的参数值 [ ComputerName ] 添加补全。
Register-ArgumentCompleter -CommandName Invoke-Command -ParameterName ComputerName -ScriptBlock {
Get-ADComputer -Filter * | Select-Object -ExpandProperty Name | ForEach-Object {
$Text = $_
if ($Text -match '\s') { $Text = $Text -replace '^|$','"' }
[System.Management.Automation.CompletionResult]::new(
$Text,
$_,
'ParameterValue',
"$_"
)
}
}
问:为什么 win+powershell5.1,和 linux+powershell6.2 补全结果不同?
答:
linux 人更喜欢按 tab 出列表,这兼容了 bash 的习惯。这和 win 上的习惯并不同。
设定方法如下:
1 升级 psreadline 版本,确保最新。
2 pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
上一篇:
Linux 命令的 tab 补全,powershell 的 tab 补全,对比大讨论!
https://www.v2ex.com/t/557876