V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ps1aniuge
V2EX  ›  PowerShell

从“撸串.ps1”开始学习 [powershell 的参数补全]

  •  
  •   ps1aniuge · 2019-05-14 13:19:50 +08:00 · 3094 次点击
    这是一个创建于 1801 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ------ [第二章 从 [撸串.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
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5503 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:28 · PVG 11:28 · LAX 20:28 · JFK 23:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.