2015-09-29 61 views
0

我有一個函數,我正在編寫,我想在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) 

這是什麼樣的,我想也沒有用。

回答

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沒有通配符將產生相同的結果,如果我們只有=

+0

感謝@Matt編輯和答案。你將如何使用你的格式方法來引導一個基於位置的通配符,即'傳真%'和'%傳真%'。我認爲我發現了一個非常簡單的方法,通過您對類似聲明的評論,也將搜索等同於某種程度上當%不存在並將發佈時。 – ssaviers

+0

@ssaviers最簡單的事情是將一個帶有ValidateSet的字符串設置爲Wild ['ValidateSet(「On」,「Off」,「Prefix」,「Suffix」)]''。然後使用switch語句,可以有條件地設置通配符的存在。 – Matt

0

使用Matts參考我發現這似乎也適用。我試圖讓所有瘋狂的案件陳述之前,並檢查通過$name[0]$name[-1]傳遞的值,看看通配符值是什麼位置來定義特定的病例語句運行,而不是認爲類似的聲明並不真正關心。

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'") 
} 

謝謝馬特!