Хеш-таблицы Powershell в качестве аргумента для пользовательского командлета в C # - PullRequest
1 голос
/ 16 ноября 2011

Я уже некоторое время использую пользовательский класс в 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()

И это прекрасно работает.

Однако я хотел создать CmdLet в C #, чтобы сделать работу вместо этого. Поэтому после создания командлета я подумал, что могу выполнить одно из следующих действий:

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)
  • Невозможно найти параметр, который соответствует имени параметра «Свойство»
  • И еще пара.

Мой класс:

[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 "", все работает нормально, но все должно быть в 1 строке, что очень плохо для чтения. Так что хеш-таблица действительно мое самое большое желание:).

Может кто-нибудь объяснить мне, что мне здесь не хватает? (ParameterSets ?, секретный атрибут, который я не смог найти в документации, другое)

С уважением

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Возможно, вы захотите взглянуть на функцию PowerShell, которая называется Splatting. По умолчанию командлет может принимать все свои параметры и их значения в качестве хеш-таблицы, и вы можете передать этот хеш-параметр в качестве параметра.

Function Add-ThreeNumbers {
param ($a,$b,$c)
$a + $b + $c
}

$params = @{a=10; b=15; c = 20}

Add-ThreeNumbers @params
1 голос
/ 16 ноября 2011

Если все, что вам нужно, это сделать вызов командлета в несколько строк, вы можете использовать backtick (`), чтобы расширить команду до следующей строки:

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

Или вы можете создать пользовательскийobject:

$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

Я думаю, что hashtable как объекты была функцией, которая была добавлена ​​в v3.0 (в настоящее время в CTP)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...