我有一个我正在编写的函数,我想在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)
这是我试图无济于事的。
答案 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
确定的内容。因此,如果-Wild
为true
,那么查询将如下所示:
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'")
}
谢谢马特!