2012-10-02 3 views
1

나는 문장과 변수 안에있는 코드 블록에 관해 간단한 질문을한다. 내 스크립트는 사용자 입력을 수집하고 나중에 powershell 문에서 사용할 수있는 문자열을 만듭니다. 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 내 문자열 변수로 어디 객체 문이 아무것도 안하고 있다고 생각하는 날 리드 $ 컴퓨터와 동일한 결과를 반환합니다.

감사합니다. 감사합니다.

답변

1

scriptblock은 부울 값 (또는 부울 값으로 강제 변환 될 수있는 값)으로 평가되어야합니다. 비어 있지 않은 경우 PowerShell이 ​​부울 $ true로 강제 변환하는 문자열을 제공합니다. 대신이 같은 것을보십시오 :

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

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

이 각 필터 용어를 걸어 현재 개체의 distinguishedName을에 적용하는 중첩 된 파이프 라인을 사용 - 우리가 중첩 된 파이프 라인 $_로 인해 숨기고했다 현재의 값을 취한다 $ strFilter 배열 요소. 이들 중 하나가 like 테스트를 통과하면 카운트는 0보다 커지고 파이프 라인을 통과하지 않습니다. like (count == 0)와 일치하지 않는 것들만 파이프 라인을 따라 전달되어야합니다. |

$ filteredComputers = $ 컴퓨터 :이 코드를 실행하면 시점에서

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'은 모든 것을 거짓으로 표시하는 것 같습니다. "Domain Controllers"의 입력 문자열은 도메인 컨트롤러 OU에 속하지 않아도 여전히 false를 반환합니다. 0 경기가 있기 때문에 사실이 아니어야합니까? 아마도 내가 뭔가를 잘못 해석하고있는 것일까 요? – smierdziel

+0

즉,'$ strFilter'에있는 필터 용어 중 하나와 일치하는 것을 찾습니다.'$ strFilter'의 내용은 무엇입니까? 어쩌면 당신은 거기에 필터 용어를 사용해서는 안됩니다 - 아마'**'일까요? –

+0

'**'가 일치하고 있다고 생각지 않습니다. 인스턴스를 배열로 모으는 첫 번째 while 루프에서 enter 키를 누른 다음'**'가 나오면 보통 이것을 확인합니다 내 결과를 필터링하려고합니다. 위의 예제를 복사하여 복사하면 foo가 반환되지 않습니다. – smierdziel

0

: 여기

은이 방법의 예입니다 where-object {$ strFilter}

$ strfilter의 값은 무엇입니까?

$ strfilter의 값을 되풀이하는 경우 수동으로 입력하십시오. 작동합니까? 그렇다면 단어가 맞지만 실행 방법이 잘못되었습니다.

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

대답은 두 부분으로 구성 : 1)은 ScriptBlock] 2에 문자열을 주조

0

예를 들어, 우리는 폴더의 문서 또는 우리의 사용자 폴더에서 '내 문서'를 얻을 필요) & 문자를 사용하여 문자열 (예 : 스크립트 블럭)을 호출하십시오.