我已经在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"
}
但没有运气。 :(
我一直收到如下错误:
我的班级:
[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 ?,我在文档中找不到的秘密属性,其他)
亲切的问候
答案 0 :(得分:2)
您可能想看一下名为Splatting的PowerShell功能。默认情况下,Cmdlet可以将其所有参数及其值作为哈希表,并且可以将该哈希作为参数传递。
Function Add-ThreeNumbers {
param ($a,$b,$c)
$a + $b + $c
}
$params = @{a=10; b=15; c = 20}
Add-ThreeNumbers @params
答案 1 :(得分:1)
如果你只想让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中)