Powershell哈希表作为c#中定制cmdlet的参数

本文关键字:cmdlet 参数 哈希表 Powershell | 更新日期: 2023-09-27 18:14:38

我在PS(2.0)中使用自定义类已有一段时间了:

import-module .'MyClassLib.dll
$task = New-Object MyClassLib.OracleScript -Property @{
                                                            Files="MyScript.sql" 
                                                            Database="TEST"
                                                            User="USER" 
                                                            Password="PASSWORD"  
                                                        }
$result = $task.Execute()

这个效果很好。

然而,我想在c#中创建一个CmdLet来完成这项工作。因此,在创建cmdlet之后,我认为我可以执行以下操作之一:

Invoke-OracleScript @{
                            Files="Script.sql" 
                            Database="db"
                            User="user" 
                            Password="password"  
                           }
Invoke-OracleScript @{
                            Files="Script.sql"; 
                            Database="db";
                            User="user"; 
                            Password="password";  
                           }
Invoke-OracleScript -Property @{
                            Files="Script.sql"
                            Database="db"
                            User="user"
                            Password="password"  
                           }

但是运气不好。:(.

我一直得到这样的错误:

  • 找不到文件System.Collections.Hashtable(它认为整个哈希表是Files参数)
  • 无法找到与参数名称"Property"匹配的参数
  • 和更多。

我的类:

[Cmdlet(VerbsLifecycle.Invoke, "OracleScript", ConfirmImpact = ConfirmImpact.High, SupportsShouldProcess = true, SupportsTransactions = false)]
public class Invoke_OracleScript : Cmdlet, IOracleScript
{
    [Parameter(Mandatory = true, Position = 0, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
    public string Files { get; set; }
    [Parameter(Mandatory = true, Position = 1, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
    public string Database { get; set; }
    ....

如果我使用这样的参数:-Files " -Database ",它工作得很好,但所有东西都必须在一行上,这对阅读非常不利。所以哈希表真的是我最大的愿望:).

谁能给我解释一下我在这里错过了什么?(ParameterSets ?,一个秘密属性,我无法在文档中找到,其他)

亲切的问候

Powershell哈希表作为c#中定制cmdlet的参数

您可能想看看PowerShell的一个功能,称为Splatting。默认情况下,Cmdlet可以将其所有参数及其值作为散列表,并且可以将该散列作为参数传入。

Function Add-ThreeNumbers {
param ($a,$b,$c)
$a + $b + $c
}
$params = @{a=10; b=15; c = 20}
Add-ThreeNumbers @params

如果您所关心的是使cmdlet调用在多行中,则可以使用反打号(')将命令扩展到下一行:

get-process -Name notepad `
            -Computername localhost `
            -Verbose

或者,您可以创建自定义对象:

$process = new-object psobject
$process | add-member -name name -value notepad -type noteproperty
$process | add-member -name computername -value localhost -type noteproperty
$process | get-process

或者,你在做什么:

$process = new-object psobject -property @{ name="notepad";
                                            computername = "localhost";}
$process | get-process

我认为哈希表作为对象是v3.0(目前在CTP中)添加的一个特性