首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将状态从cmdlet传递到cmdlet的常用方法

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

Stack Overflow用户
提问于 2015-08-26 17:46:30
回答 1查看 744关注 0票数 2

我正在创建自己的一组cmdlet。它们都需要相同的状态数据(比如DB的位置和连接到DB的凭据)。我想这一定是一种共同的需要,我想知道做这件事的常见习语是什么。

最明显的是

代码语言:javascript
复制
$db = my-make-dbcreds db=xxx creds=yyyy ...
my-verb1 $db | my-verb2 $db -foo 42...
my-verb8 $db bar wiz
.....

但我在想其他的方法。我能安静地把状态从一个吹到另一个吗?我知道,如果状态是我管道中唯一的东西,我可以这样做,但是这些cmdlet返回数据。

如果用户没有在命令中指定状态,我可以设置全局变量吗?

EN

回答 1

Stack Overflow用户

发布于 2015-08-26 18:02:33

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

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

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

飞溅!

溅溅是一种将参数值的集合作为单元传递给命令的方法。Windows PowerShell将集合中的每个值与命令参数关联。

以最简单的形式

代码语言:javascript
复制
$params = @{
    Filter = "*.txt"
    Path = "C:\temp"
}

Get-ChildItem @params

创建参数和值的哈希表,并将它们拆分到命令中。您可以按对cmdlet的唯一调用所允许的那样编辑表。

代码语言:javascript
复制
$params.Path = "C:\eventemperor"
Get-ChildItem @params 

我更改了path,但保留了filter。您也不必在$params中包含所有内容,您可以在同一个调用中使用其他参数。

这只是一个在你认为合适的情况下填充变量,并根据情况需要改变它们的问题。

在流水线上喷出

很漂亮,这就是它的真正名称。如果使用高级函数参数,则可以将属性从一个cmdlet链接到下一个cmdlet(如果确实需要的话)。FWIW,我认为在你的情况下喷溅是更好的,但请看以下几点。

代码语言:javascript
复制
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写入控制台,但也为下一个管道输出一个对象。所以运行命令

代码语言:javascript
复制
"Eclairs" | One | One | Out-Null

我们得到以下输出

代码语言:javascript
复制
You Must Like Eclairs
You Must Like Eclairs

我们得把它吹出来

代码语言:javascript
复制
Pastry                                                                                                                                                                                                               
------                                                                                                                                                                                                               
{Eclairs} 

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

代码语言:javascript
复制
"Eclair" | One | Tee-Object -Variable oneresults | One | Out-Null
$oneresults

考虑参数默认值

在试图找到一种更好的方法在处理同一个数据库的多个函数之间传递SQL连接信息之后,重新讨论这个概念。我不知道这是不是最好的做法,但它肯定简化了我的事情。

其基本思想是,如果cmdlet共享命名约定,则为cmdlet添加规则或通配符规则。例如,我有一系列与我们的票务系统交互的功能。它们都是从Get-Task....开始的,并且都配置了SQL信息。

代码语言:javascript
复制
$invokeSQLParameters = @{
    ServerInstance = "serverName"
    Username = $Credentials.UserName
    Password = $Credentials.GetNetworkCredential().Password
}
$PSDefaultParameterValues.Add("New-Task*:Connection",$invokeSQLParameters)
$PSDefaultParameterValues.Add("Get-Task*:Connection",$invokeSQLParameters)

因此,在我的函数中,我有一个名为Connection的参数,只要在调用之前完成上述操作,它将始终使用$invokeSQLParameters填充。我还是用飞溅法

代码语言:javascript
复制
Invoke-Sqlcmd -Query $getCommentsQuery @Connection

您可以在上阅读更多有关这方面的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32233313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档