将状态从cmdlet传递到cmdlet的常用方法

时间:2015-08-26 17:46:31

标签: powershell

我正在创建自己的cmdlet集。它们都需要相同的状态数据(如DB的位置和连接到DB的凭据)。我认为这必须是一个共同的需要,并想知道这样做的常见习惯是什么。

显而易见的是

$db = my-make-dbcreds db=xxx creds=yyyy ...
my-verb1 $db | my-verb2 $db -foo 42...
my-verb8 $db bar wiz
.....

但我想知道其他方法。我可以默默地将状态从一个管道传输到另一个状态。我知道我可以这样做,如果状态是我唯一管道但这些cmdlet返回数据

如果用户未在命令

中指定状态,是否可以设置我使用的全局变量

1 个答案:

答案 0 :(得分:0)

通过管道传递信息状态对我来说有点遗失。您可以更新cmdlet以返回下一个cmdlet将通过ValueFromPipeline接受的对象。当你提到

  

类似于DB的位置和连接到DB的凭据

我认为你想要的最好的是....

<强>泼洒!

  

Splatting是一种传递参数集合的方法       作为单位的命令的值。 Windows PowerShell关联       带有命令参数的集合中的每个值。

最简单的形式

struct results

创建参数和值的哈希表,并将它们splat到命令中。您可以编辑表格,因为对cmdlet的唯一调用将允许。

$params = @{
    Filter = "*.txt"
    Path = "C:\temp"
}

Get-ChildItem @params

我更改了$params.Path = "C:\eventemperor" Get-ChildItem @params ,但保留了path。你也不必拥有filter中的所有内容,并在同一个调用中使用其他参数。

只需按照您认为合适的方式填充变量并根据需要更改它们。

关注管道

漂亮就是它实际上被称为。如果使用高级函数参数,则可以将属性从一个cmdlet链接到下一个cmdlet(如果您确实需要)。 FWIW我认为在您的情况下喷溅更好,但请看下面的内容。

$params

将变量function One{ param( [parameter(Mandatory=$true, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$true)] [String[]] $Pastry ) write-host "You Must Like $Pastry" Write-Output (New-Object -TypeName PSCustomObject -Property @{Pastry= $pastry}) # If you have at least PowerShell 3.0 # [pscustomobject]@{Pastry= $pastry} } 写入控制台但同时输出下一个管道对象的简单函数。所以运行命令

$pastry

我们得到以下输出

"Eclairs" | One | One | Out-Null

我们需要在最后输出Out-Null,否则你会得到它。

You Must Like Eclairs
You Must Like Eclairs

也许不是最好的例子,但你应该明白这个想法。如果要在管道调用之间提取信息,可以使用Tee-Object

Pastry                                                                                                                                                                                                               
------                                                                                                                                                                                                               
{Eclairs} 

考虑参数默认值

在尝试查找在针对同一数据库的多个函数之间传递SQL连接信息的更好方法之后,重新审视此概念。我不确定这是否是最好的事情,但它确实简化了我的事情。

如果cmdlet共享命名约定,则基本思想是为cmdlet或通配符规则添加规则。例如,我有一系列与我们的票务系统互动的功能。它们都以"Eclair" | One | Tee-Object -Variable oneresults | One | Out-Null $oneresults 开头,并且都配置了SQL连接信息。

Get-Task....

所以现在在我的函数中,我有一个名为$invokeSQLParameters = @{ ServerInstance = "serverName" Username = $Credentials.UserName Password = $Credentials.GetNetworkCredential().Password } $PSDefaultParameterValues.Add("New-Task*:Connection",$invokeSQLParameters) $PSDefaultParameterValues.Add("Get-Task*:Connection",$invokeSQLParameters) 的参数,只要在调用之前完成上述操作,就会始终使用Connection填充。我仍然使用splatting

$invokeSQLParameters

您可以在about_parameters_default_values

了解更多相关信息