2012-10-02 91 views
1

我有一個關於語句和變量內代碼塊的簡單問題。我的腳本收集用戶輸入並創建一個可以在以後的powershell語句中使用的字符串。Powershell - 用變量替換codeblock

$filter = @() 
While ($filter[-1] -ne "end") { 
    $filter += read-host 'Type the name of an OU you want to filter or type "end" to start the script' 
    if ($filter[-1] -eq "end") { 
    break 
    } 
    $strFilter += "`$_`.DistinguishedName -notlike `"*" + $filter[-1] + "*`" " 
    $strFilter += "-and " 
} 
$strFilter = $strFilter.SubString(0,$strFilter.length-5) 

基本上用戶將鍵入然而,許多單詞,這些單詞將被追加到字符串"$_.DistinguishedName -notlike "*<WORD>*""-and一起扔,直到進入最後一個字。

這部分工作正常,它使用這個生成的字符串來收集似乎沒有工作的信息;我有一種感覺,這是非常簡單的,我只是想念。

例如:

$computers = get-adcomputer -Filter 'ObjectClass -eq "Computer"' -properties "OperatingSystem","CanonicalName","Description" 
$filteredComputers = $computers | where-object { $strFilter } 

$ filteredComputers返回相同的結果$電腦這使我相信,我的字符串變量在哪裏對象的語句沒有做任何事情。

感謝任何幫助,謝謝。

回答

1

Where-Object scriptblock應計​​算爲布爾值(或可以強制爲布爾值的東西)。你只提供一個字符串,如果不是空的話,PowerShell將強制爲一個布爾值$ true。嘗試這樣的事情,而不是:

$strFilter = @() 
while (...) { ... 
    $strFilter += "*$($filter[-1])*" 
} 

$filteredComputers = $computers | 
    Where {$dn=$_.DistinguishedName; @($strFilter | Where {$dn -like $_}).Count -eq 0} 

此使用嵌套管道走路每個過濾項並將其應用到當前對象的distinguishedName來 - 這是我們不得不在嵌套管道$_因爲藏匿需要對當前的值$ strFilter數組元素。如果其中任何一個通過like測試,則計數將大於零,並且不會傳遞到管道中。只有那些不匹配(count == 0)的應該傳遞給管道。

下面是這種方法的一個例子:

C:\PS> $strFilter = '*ba*','*bog*' 
C:\PS> 'foo','bar','baz','abba','boggle' | 
      Where {$dn=$_; @($strFilter | Where {$dn -like $_}).Count -eq 0} 

foo 
+0

'($ strFilter | Where {$ dn-like $ _})。Count -eq 0'似乎將所有內容標記爲false,例如即使它不屬於任何域控制器OU,輸入字符串「域控制器」仍將返回false。它不是真的,因爲有0比賽?也許我誤解了一些東西? – smierdziel

+0

這意味着它正在匹配'$ strFilter'中的某個過濾項。'$ strFilter'的內容是什麼?也許你在那裏有一個過濾條件不應該 - 也許是'**'? –

+0

我不相信'**'正在匹配,如果你在第一個while循環期間按下輸入,將實例集合到數組中,那麼會出現'**',我通常會檢查這個試圖過濾我的結果。當我複製粘貼上面的例子時,foo不會被返回。 – smierdziel

0

在某個時間點,當你運行該代碼:

$ filteredComputers = $計算機| where-object {$ strFilter}

$ strfilter的值是什麼?

如果回顯$ strfilter的值,請嘗試手動輸入它的位置,它是否工作?如果是這樣的話是正確的,但執行方法是錯誤的。

0

例如,我們需要得到的只是該文件夾的文件或從我們的用戶文件夾「我的文檔」:

[scriptblock]$filterBlock = { $_.Name -like '*ocum*' } 
dir | ?{ & $filterBlock } 

答案由兩個部分組成: 1)投你的字符串[腳本塊] 2 )使用&字符來調用你的字符串(即你的scriptblock)