我正在创建自己的一组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返回数据。
如果用户没有在命令中指定状态,我可以设置全局变量吗?
发布于 2015-08-26 18:02:33
通过管道传递信息状态让我有点不知所措。您可以更新cmdlet以返回下一个cmdlet将通过ValueFromPipeline接受的对象。当你提到
类似于DB的位置和连接到DB的凭据。
我认为你想要的最好的是.
飞溅!
溅溅是一种将参数值的集合作为单元传递给命令的方法。Windows PowerShell将集合中的每个值与命令参数关联。
以最简单的形式
$params = @{
Filter = "*.txt"
Path = "C:\temp"
}
Get-ChildItem @params创建参数和值的哈希表,并将它们拆分到命令中。您可以按对cmdlet的唯一调用所允许的那样编辑表。
$params.Path = "C:\eventemperor"
Get-ChildItem @params 我更改了path,但保留了filter。您也不必在$params中包含所有内容,您可以在同一个调用中使用其他参数。
这只是一个在你认为合适的情况下填充变量,并根据情况需要改变它们的问题。
在流水线上喷出
很漂亮,这就是它的真正名称。如果使用高级函数参数,则可以将属性从一个cmdlet链接到下一个cmdlet(如果确实需要的话)。FWIW,我认为在你的情况下喷溅是更好的,但请看以下几点。
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我们得到以下输出
You Must Like Eclairs
You Must Like Eclairs我们得把它吹出来
Pastry
------
{Eclairs} 也许不是最好的例子,但你应该明白这个想法。如果您想在管道调用之间提取信息,可以使用Tee-Object。
"Eclair" | One | Tee-Object -Variable oneresults | One | Out-Null
$oneresults考虑参数默认值
在试图找到一种更好的方法在处理同一个数据库的多个函数之间传递SQL连接信息之后,重新讨论这个概念。我不知道这是不是最好的做法,但它肯定简化了我的事情。
其基本思想是,如果cmdlet共享命名约定,则为cmdlet添加规则或通配符规则。例如,我有一系列与我们的票务系统交互的功能。它们都是从Get-Task....开始的,并且都配置了SQL信息。
$invokeSQLParameters = @{
ServerInstance = "serverName"
Username = $Credentials.UserName
Password = $Credentials.GetNetworkCredential().Password
}
$PSDefaultParameterValues.Add("New-Task*:Connection",$invokeSQLParameters)
$PSDefaultParameterValues.Add("Get-Task*:Connection",$invokeSQLParameters)因此,在我的函数中,我有一个名为Connection的参数,只要在调用之前完成上述操作,它将始终使用$invokeSQLParameters填充。我还是用飞溅法
Invoke-Sqlcmd -Query $getCommentsQuery @Connection您可以在值上阅读更多有关这方面的内容。
https://stackoverflow.com/questions/32233313
复制相似问题