2014-01-14 2 views
1

PowerShell v2에서 foreach-object 루프를 종료하는 데 문제가 있습니다. 텍스트 파일의 각 호스트에 대한 텍스트 파일 PowerShell v2에서 foreach 루프를 깨기

  • 에서 호스트 시스템의

    • 읽기 목록 Win32_Product와 (대한 필터를 얻을 : 내가 달성하기 위해 노력하고있어 작업의 거친 아이디어를 들어, 여기에 의사 코드입니다 제외 목록) 출력을 html로 변환하고 저장합니다.

    스크립트의 이유는 표준 클라이언트 이미지에 포함 된 모든 응용 프로그램을 나열한 텍스트 파일을 얻었 기 때문에 정기적으로 다른 텍스트 파일에서 호스트를 검사하여 무단, 스케치 또는 그렇지 않으면 호스트 시스템에서 불필요한 응용 프로그램.

    코드가 거친면에서 효과가 있지만 주요 문제는 수동 개입없이 스크립트가 종료되지 않는다는 것입니다. 여기에 누락 된 구성 요소가 일부 조건이 존재할 때까지 루프를 실행하는 것입니다 (즉, 호스트 파일의 첫 번째 줄이 두 번째로 발견됨). 그런 다음 스크립트를 종료합니다. 이것이 내가 상상 한 방법이지만, 나는 항상 다른 논리에 열려있다. 특히 더 효율적이라면.

    여기에 실제 코드는 다음과 같습니다

    Get-Content c:\path\to\testhostlist.txt | Foreach-Object { 
    Get-WmiObject Win32_Product | 
    Where-Object { $_.Name -f "'C:\path\to\testauthapplist.txt'" | 
    
    ConvertTo-Html name,vendor,version -title $name -body "<H2>Unauthorized Applications.</H2>"}} | 
    
    Set-Content c:\path\to\unauthapplisttest.html 
    
  • +0

    코드를 이해할 수 없습니다. ** 위치 - 개체 ** 필터는 조건을 테스트하지 않습니다. '$ _. Name '은 형식 문자열이 아니기 때문에'$ _. Name -f " 'C : \ path \ to \ testauthapplist.txt' '"는 이해가되지 않습니다. 아마도 복사/붙여 넣기 오류가 있었습니까? '$ _. Name '과'-f' 사이에는 뭔가 빠져있는 것처럼 보입니다. 또한 한 번만 나열하면 호스트 파일의 첫 번째 행이 두 번째로 발생합니까? 이것은 출구 조건이 필요한 무한 루프처럼 보이지 않습니다. ** Foreach-Object **는 무기한 반복되지 않습니다. 아마도 코드가 엉망이되어 막혔을 것입니다. –

    +0

    'Where-Object {$ _. Name -f " 'C : \ path \ to \ testauthapplist.txt'"} "로 무엇을하려하는지 설명하십시오. 문제는 그게 당신이하려는 일에 맞는 구문이 아니라는 것입니다. –

    +0

    그것이 종료 될 것으로 판단됩니다. 그것은 단지 매우 느립니다. 'Get-WmiObject Win32_Product'는 매우 느리고 입력 파일의 각 줄마다 작업을 수행합니다. 처음에는 한 번 해보고 결과를 목록에 보관해야합니다. 나는 Adi와 당신의 어디에서 물건이 이상하다는 것에 동의합니다. 나는 한발 물러서서 모든 것을 재 작업해야한다고 생각합니다. –

    답변

    2

    을 건너 뛰려면 ' 한 번만 나열하십시오. 이것은 출구 조건이 필요한 무한 루프처럼 보이지 않습니다. Foreach-Object은 무기한 반복하지 않습니다.

    문제는 루프가 조건없이 종료되지 않는다는 것입니다. 구문이 유효하지 않습니다.

    1. 경우 객체는 특정 조건을 만족하는 개체를 전달하여 파이프 라인을 필터링하지만, 다음에 스크립트 블록은 부울 테스트를 수행하지 않습니다.
    2. 실제로 스크립트 블록의 내용은 유효하지 않습니다. -f은 형식 연산자이며 형식 문자열을 왼쪽 피연산자로 사용하지만 $_.Name은 형식 문자열이 아닙니다.

    나는 (아이디어가 그 이름 속성이 testauthapplist.txt에 나열되지 않은 개체에 대한 Get-WmiObject Win32_Product의 결과를 필터링하는 것입니다, 당신의 설명에 따라, 내가 여기 추측을거야 그것을 "제외 목록"이라고합니다).

    Get-Content c:\path\to\testhostlist.txt | %{ 
        Get-WmiObject Win32_Product | ?{ 
        (Get-Content 'C:\path\to\testauthapplist.txt') -notcontains $_.Name 
        } | ConvertTo-Html name,vendor,version -title $name -body "<H2>Unauthorized Applications.</H2>" 
    } | Set-Content c:\path\to\unauthapplisttest.html 
    

    (%{}?{} 각각 의 Foreach-객체경우 객체에 대한 약어 그냥 참고 : 그렇다면, 이것은 올바른 구문입니다.)

    1

    내가 당신이 완전히 스크립트를 중지하려고 제대로 이해하면? 그렇다면 Break을 시도 했습니까? 당신은 단지 당신 때문에 내가 발생 될 호스트 파일의 첫 번째 줄은 (난 당신이 testhostlist.tx을 의미 추론) 방법 두 번째 표시되지 않는 루프를 사용 continue

    0
    $hostlist = Get-Content c:\path\to\testhostlist.txt 
    $a = @() 
    Foreach($item in $hostlist) 
    { 
        $a += "<style>" 
        $a += "BODY{background-color:gray;}" 
        $a += "TABLE{margin: auto;border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}" 
        $a += "TH{border-width: 1px;padding: 4px;border-style: solid;border-color: black;background-color:yellow}" 
        $a += "TD{border-width: 1px;padding: 4px;border-style: solid;border-color: black;background-color:white}" 
        $a += "h2{color:#fff;}" 
        $a += "</style>" 
    
        Get-WmiObject Win32_Product | select name,vendor,version | sort name | ConvertTo-Html -head $a -body "<Center><H2>Unauthorized Applications.</H2></Center>" | Out-File c:\path\to\$item"-applist.html" 
    } 
    
    관련 문제