1

ステートメント内のコードブロックと変数に関して簡単な質問があります。私のスクリプトはユーザー入力を収集し、後でPowerShellステートメントで使用できる文字列を作成します。

$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は$computersと同じ結果を返します。これにより、文字列変数を含むWhere-objectステートメントは何も実行していないと思います。

助けてくれてありがとう。

4

3 に答える 3

1

scriptblockWhere-Objectは、ブール値(またはブール値に強制変換できるもの)に評価される必要があります。空でない場合、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
于 2012-10-02T22:36:03.593 に答える
0

このコードを実行した時点で:

$ filteredComputers = $ computers | where-object {$ strFilter}

$ strfilterの値は何ですか?

$ strfilterの値をエコーバックする場合は、その場所に手動で入力してみてください。機能しますか?もしそうなら、言葉は正しいですが、実行方法は間違っています。

于 2012-10-02T22:38:48.450 に答える
0

たとえば、ユーザーフォルダからDocumentsフォルダまたは「Mydocuments」フォルダのみを取得する必要があります。

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

答えは2つの部分で構成されています:1)文字列を[ScriptBlock]にキャストします2)&文字を使用して文字列(つまり、scriptblock)を呼び出します

于 2012-10-02T22:50:23.100 に答える