创建函数参数接受通配符

时间:2015-09-29 23:50:02

标签: powershell

我有一个我正在编写的函数,我想在WMI调用上创建一个通配符进程。想知道我的选择可能是什么。我的第一个想法是获取发送的参数值并用百分号替换任何星号,并且具有将使用查询字符串的case语句,具体取决于我是否需要使用LIKE语句。我是不是让它复杂化了,还有一种我找不到的简单方法吗?

这是函数的顶部部分,因为

[CmdletBinding()]    
Param(
[Parameter(Mandatory=$false,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)][string]$Name = "",
[Parameter(Mandatory=$false,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)][string]$ComputerName = $env:ComputerName,
[Parameter()][string]$Port = "",
[Parameter()][switch]$Full
)

Process {
 if($ComputerName.Trim()) {
    try {
    $printers = (Get-WmiObject -Query "select * from Win32_printer where portname like '%$port%' and name like '%$Name%' " -ComputerName $ComputerName -EnableAllPrivileges -ErrorAction Stop) 

这是我试图无济于事的。

2 个答案:

答案 0 :(得分:1)

我们清除了这个功能的混乱,以显示证明我们观点所需的最低限度。 Like的优点是使用通配符,但是没有它们,比较仍然可以正常运行。唯一需要注意的是可能是性能问题而=会更好。重点是,为了简单起见,我们可以选择将通配符添加到查询字符串中。

Function Get-Printers{
[CmdletBinding()]    
Param(
    [Parameter()][string]$Name = "",
    [Parameter()][string]$Port = "",
    [Parameter()][switch]$Wild = $True
)
    $wildcard = if($wild){"%"}Else{$null}
    Get-WmiObject -Query ("select * from Win32_printer where portname like '{0}$port{0}' and name like '{0}$Name{0}'" -f $wildcard)
}

因此,默认情况下,该函数将使用通配符。在查询字符串中,我们使用格式运算符来添加$wildcard确定的内容。因此,如果-Wildtrue,那么查询将如下所示:

select * from Win32_printer where portname like '%Fax%' and name like '%Fax%'

否则,如果它是假的,那么同样的查询将如下所示:

select * from Win32_printer where portname like 'Fax' and name like 'Fax'

重申一下,考虑到后一个问题,使用没有通配符的like会产生与我们=时相同的结果。

答案 1 :(得分:0)

使用Matts参考我发现这似乎也有效。在尝试使用case语句并检查通过$name[0]$name[-1]传递的值之前,我试图让所有人疯狂,看看外卡值是什么位置来定义特定的case语句,而不是认为喜欢声明并不在乎。

Function Get-Printers{
[CmdletBinding()]    
Param(
    [Parameter()][string]$Name = "*",
    [Parameter()][string]$Port = "*"
)
    $Name = $Name.Replace('*','%')
    $Port = $Port.Replace('*','%')

    Get-WmiObject -Query ("select * from Win32_printer where portname like '$port' and name like '$Name'")
}

谢谢马特!