我正在创建自己的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返回数据
如果用户未在命令
中指定状态,是否可以设置我使用的全局变量答案 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
了解更多相关信息