Powershell:TabExpansion++ ArgumentCompleter 的多个参数

2023-12-02

我正在开发一个功能来安排用户的主驱动器传输,我将使用 TabExpansion++ 来允许用户自动完成服务器名称,该名称是从 CSV 文件填充的。两者都会有参数OldServer and NewServer.

TabExpansion++ 是否可以为单个自动完成器指定多个参数?

这是我所拥有的:

function HomeDriveSiteCompletion {
[ArgumentCompleter(
    Parameter = 'OldServer',
    Command = { 'Schedule-HomeTransfer' },
    Description = 'Home drive transfer tool server name autocomplete')]
param($commandName,$parameterName,$wordToComplete,$commandAst,$fakeBoundParameter)

Import-Csv -Path $Global:ServersList | % {New-CompletionResult -ToolTip $_.Site -completiontext $_.Site}    
}

这适用于OldServer。如果我可以通过在同一位置指定两个参数来保存代码,那就太理想了。我都尝试过

Parameter = @('OldServer','NewServer')

and

Parameter = { 'OldServer','NewServer' }

两者都不起作用。我还有其他方法可以让这项工作成功吗?


像这样的问题就是我喜欢这个网站的原因。我没有使用 TabExpansion++,但我已经为参数做了一些制表符扩展。我不记得以前是否遇到过这个确切的问题,所以我去寻找并发现了一些我以前在 PowerShell 世界中从未遇到过的东西,DynamicParam。我以前怎么没见过这个?在这种情况下,它的出色程度简直是超乎想象的!它允许您做的不是声明参数,而是在函数的实际脚本块之前添加该参数,并执行脚本类型的操作来验证该参数。

我向谷歌寻求一点帮助,它给我指出了thisSO问题(Shay Levy给出了推荐TabExpansion++的公认答案),但下一个答案是关于DynamicParam的。所以我查了一下发现thisMicrosoft 网站上的博客进一步解释了这一点。基本上根据您的需求,您会执行以下操作:

DynamicParam {
    $SrvList = Import-CSV $Global:ServerList | Select -Expand Site
    $ParamNames = @('OldServer','NewServer')

    #Create Param Dictionary
    $ParamDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary

    ForEach($Name in $ParamNames){

        #Create a container for the new parameter's various attributes, like Manditory, HelpMessage, etc that usually goes in the [Parameter()] part
        $ParamAttribCollecton = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]

        #Create each attribute
        $ParamAttrib = new-object System.Management.Automation.ParameterAttribute
        $ParamAttrib.Mandatory = $true
        $ParamAttrib.HelpMessage = "Enter a server name"

        #Create ValidationSet to make tab-complete work
        $ParamValSet = New-Object -type System.Management.Automation.ValidateSetAttribute($SrvList)

        #Add attributes and validationset to the container
        $ParamAttribCollecton.Add($ParamAttrib)
        $ParamAttribCollecton.Add($ParamValSet)

        #Create the actual parameter,  then add it to the Param Dictionary
        $MyParam = new-object -Type System.Management.Automation.RuntimeDefinedParameter($Name, [String], $ParamAttribCollecton)
        $ParamDictionary.Add($Name, $MyParam)
    }

    #Return the param dictionary so the function can add the parameters to itself
    return $ParamDictionary
}

这会将 OldServer 和 NewServer 参数添加到您的函数中。两者都将以制表符方式完成位于 CSV 的“站点”列中列出的服务器$global:ServerList。当然,它不像 TabExpansion++ 的上下文那么简短和甜蜜,但另一方面,它不需要任何额外的模块或在系统上加载任何内容,因为它是完全独立的并且仅使用基本的 PowerShell 功能。

现在,添加了参数,但实际上并没有将它们分配给变量,所以我们必须在Begin函数的一部分。我们将列出参数PSBoundParameters.Keys并检查当前作用域中是否已存在变量,如果不存在,我们将在当前作用域中创建一个变量,以便扰乱函数之外的任何内容。因此,基本参数为-User、两个动态参数,以及添加动态参数的变量,我们正在为您的函数寻找类似的内容:

Function Schedule-HomeTransfer{
[CmdletBinding()]
Param([string]$User)
DynamicParam {
    $SrvList = Import-CSV $Global:ServerList | Select -Expand Site
    $ParamNames = @('OldServer','NewServer')

    #Create Param Dictionary
    $ParamDictionary = new-object -Type System.Management.Automation.RuntimeDefinedParameterDictionary

    ForEach($Name in $ParamNames){

        #Create a container for the new parameter's various attributes, like Manditory, HelpMessage, etc that usually goes in the [Parameter()] part
        $ParamAttribCollecton = new-object -Type System.Collections.ObjectModel.Collection[System.Attribute]

        #Create each attribute
        $ParamAttrib = new-object System.Management.Automation.ParameterAttribute
        $ParamAttrib.Mandatory = $true
        $ParamAttrib.HelpMessage = "Enter a server name"

        #Create ValidationSet to make tab-complete work
        $ParamValSet = New-Object -type System.Management.Automation.ValidateSetAttribute($SrvList)

        #Add attributes and validationset to the container
        $ParamAttribCollecton.Add($ParamAttrib)
        $ParamAttribCollecton.Add($ParamValSet)

        #Create the actual parameter,  then add it to the Param Dictionary
        $MyParam = new-object -Type System.Management.Automation.RuntimeDefinedParameter($Name, [String], $ParamAttribCollecton)
        $ParamDictionary.Add($Name, $MyParam)
    }

    #Return the param dictionary so the function can add the parameters to itself
    return $ParamDictionary
}
Begin{$PSBoundParameters.Keys | Where{!(Get-Variable -name $_ -Scope 0 -ErrorAction SilentlyContinue)} | ForEach{New-Variable -Name $_ -Value $PSBoundParameters[$_]}}
Process{
    "You chose to move $User from $OldServer to $NewServer"
}
}

那里将允许制表符完成-OldServer and -NewServer,当我设置$global:ServerList到“C:\Temp\new.csv”并填充具有 3 个值的“站点”列,这些值会立即弹出供我选择(在 ISE 中,它实际上会弹出一个列表可供选择,而不仅仅是选项卡完成就像在控制台中一样)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell:TabExpansion++ ArgumentCompleter 的多个参数 的相关文章

随机推荐

  • C++循环包含问题[重复]

    这个问题在这里已经有答案了 我有这个文件 logger hpp ifndef LOGGER HPP define LOGGER HPP include event hpp Class definitions class Logger pub
  • 场景图形/显示列表之外的 AS3 事件冒泡

    您好 只是想知道是否可以在 AS3 中的非显示列表类中利用事件冒泡 例如 在应用程序的模型中 有一个包含许多汽车的 City 类 有哪些方法可以将事件侦听器附加到 City 对象并接收从子 Cars 冒出的事件 澄清一下 City 和 Ca
  • 当我们在 C 中取消引用 NULL 指针时,操作系统中会发生什么?

    假设有一个指针 我们用 NULL 初始化它 int ptr NULL ptr 10 现在 程序将会崩溃 因为ptr没有指向任何地址 我们正在为其分配一个值 这是无效的访问 那么 问题是 操作系统内部发生了什么 是否发生页面错误 分段错误 内
  • 多线程哪个最好用? (线程池或线程)

    希望这是一个比我之前提出的问题更好的问题 我有一个 exe 文件 我将向其传递不同的参数 文件路径 然后它将接受并解析该参数 因此 我将进行一个循环 循环遍历列表中的文件路径并将它们传递给此 exe 文件 为了提高效率 我想将执行分散到多个
  • 我可以像这样重写我的网址吗?这是一个好主意吗?

    是否可以重写 Apache Mod Rewrite 一个 URL http www example com view php t h5k6对此http www example com h5k6 进行此重写的原因是 URL 需要非常短 有点像
  • 在 Android 中获取 BLE Beacon 的 Tx 功率

    我想通过 Android 设备获取 BLE 信标的 Tx 功率 我在这里定义了 Tx 功率的分配数量 public class AssignedNumbers public static final byte TXPOWER 0x0A 然后
  • Spring @Required 注解已弃用?

    我正在尝试添加 Required对我的 bean 的注释 但编译器说它已被弃用 public class Product private String id public String getId return id Required pu
  • 如何隐藏任务栏系统托盘中的JFrame

    我创建了一个JFrame并想将其隐藏在taskbar in windows 但是 它不应该在右下角可见 而是隐藏在tray menu items 有人能告诉我该怎么做吗 我需要对系统设置进行一些更改吗windows 例如 您可能见过一些do
  • 使用 Contains 构建 Lambda 表达式

    我在将简单 linq 查询转换为 Lambda 表达式时遇到问题 我的查询如下所示 int array List
  • 如何使用“echo”将 echo 重定向命令重定向(或写入)到 .bat 文件?

    还有更多细节 在A bat文件 我想向另一个文件写入一条语句B bat文件带有 echo 重定向 但语句是另一个 echo 重定向 我想要实现的内容如下 A bat echo echo set p log 1 gt gt C txt gt
  • 允许支持者以其他用户身份登录

    我们目前有一个 Identity server 4 应用程序 使用实体框架核心和 asp net 标识 我们有一群支持者 他们需要能够访问我们的用户帐户 以便通过电话帮助他们解决问题 我们的用户无法弄清楚如何使用团队查看器 因为他们中的大多
  • 跨域ajax请求

    我想从跨域URL获取HTML响应页面 为此 我使用 ajax 请求 ajax type GET url http wcidevapps com salescentral idisk 0001000383 iDisk dataType jso
  • openERP中无法导入自定义模块

    我已经完成了简单的自定义模块openerp使用 python 和 xml 但我无法在 openerp 中导入 我的模块没有在 openerp 中显示 this is init py import os os environ TZ UTC S
  • 将html添加到div而不替换其中当前内容

    我正在尝试将 dhtml 添加到 ID 为 upload results 的 div 中 这应该可以在不替换 div 中当前内容的情况下工作 代码 有趣的部分在底部
  • 替换 ffdf 对象中的 NA

    我正在使用一个 ffdf 对象 该对象在某些列中具有 NA NA 是使用左外合并的结果合并 ffdf 我想用 0 替换 NA 但没能做到 这是我正在运行的代码 library ffbase deals lt merge deals rk b
  • 泛型结构中的运算符重载:我可以为特定类型(?)的泛型创建重载吗?

    我正在 C 中使用通用结构定义物理单位 一切进展顺利 直到出现错误 二元运算符的参数之一必须是包含类型 当尝试重载数学运算符以便它们在不同单位之间进行转换时 所以 我有这样的事情 public interface ScalarUnit pu
  • 如果 Firestore 数据库发生更改,我是否需要重新读取所有文档?

    假设我尝试使用 Firestore 侦听器获取用户喜欢的 eventID 列表 我也使用离线持久化 从这个线程 Firestore 使用缓存直到在线内容更新 我知道侦听器将立即使用缓存中的结果触发 如果有更改结果 我将获得包含更改的另一个快
  • 使用bash对数据进行水平排序

    我有一个充满列数据的文件 sarah mark john 10 20 5 x y z 我想对数据进行排序 使列保持完整 但第二行按递增顺序排列 因此如下所示 john sarah mark 5 10 20 z x y 我一直在查看排序命令
  • 在 OpenCV 中使用 inRange() 检测某个范围内的颜色

    我正在使用 OpenCV 编写一个用于月球陨石坑检测的 C 程序 该程序似乎只能准确检测到一小部分陨石坑 我的这种方法的策略是首先将图像转换为 HSV 然后使用inRange 捕获一系列值中的颜色以产生阈值 然后对其进行高斯模糊并使用Hou
  • Powershell:TabExpansion++ ArgumentCompleter 的多个参数

    我正在开发一个功能来安排用户的主驱动器传输 我将使用 TabExpansion 来允许用户自动完成服务器名称 该名称是从 CSV 文件填充的 两者都会有参数OldServer and NewServer TabExpansion 是否可以为