2016-06-18 1 views
1

설명 할 수없는 다소 이상한 동작이 나타납니다.Write-Host의 이상한 부작용 Write-Host

텍스트 파일을 스트리밍하는 코드는 잘 보입니다. 나는 쓰기 호스트 줄을 REM 수면 경우

$journalPath = "$(Split-Path $($script:myInvocation.myCommand.path) -parent)\Journals" 

$journals = Get-ChildItem $journalPath -filter "journal.*.txt" 

Write-Host "Streaming" 
foreach ($journal in $journals) { 
    $reader = [System.IO.File]::OpenText("$journalPath\$journal") 
    do { 
     $line = ($reader.ReadLine()).Trim() 
     if (-not ($line.StartsWith("'"))) { 
      Write-Host $line 
     } 
    } until ($line -eq $null) 

    $reader.Close() 
} 

그러나, 나는 라인 9

You cannot call a method on a null-valued expression. 

$reader.ReadLine() 라인을 얻을. 왜 단순한 Write-Line이이 영향을 미칩니 까? 조건이 마지막에 발생하기 때문에 모든 (사후 소위) (소위 사전 검사) While() {…} 루프, Do {…} While()뿐만 아니라 Do {…} Until() 루프는 달리

+0

당신 "REM"그것을하면? Rem PowerShell 지시어는 없습니다. 우리에게 실패한 코드를 보여주십시오. –

+0

매번이 예외를 받아야합니다. 내 생각에, 당신은 일을 끝내기 위해 코드를 기다릴 정도로 인내심이 없거나 파일을 길게 만들 수 있습니다. – PetSerAl

+0

Rem in remark. 그래서 # Write-Host $ line – Gordon

답변

0

항상 자신의 코드 블록 적어도 한 번을 수행합니다 루프의

다음 예제는 이 포함 된 파일 내용을 반복적으로 반복하는 기본 시나리오를 보여줍니다.은 현재 반복/반복에서 읽기 라인이 널 값 표현식으로 평가 될 수 있는지 보여줍니다. .NET File Class[System.IO.File]을 호출 할 필요가 없습니다.

$journalPath = "$(Split-Path $($script:myInvocation.myCommand.Path) -parent)\Journals" 
$journals = Get-ChildItem $journalPath -filter "journal*.txt" 
foreach ($journal in $journals) { 
    Write-Host "`r`n" (" " * 10) "testing " $journal.Name 

    'DO {} WHILE ($line -ne $null)' 
    $reader = [System.IO.File]::OpenText("$journalPath\$journal") 
    Do { 
     $line = $reader.ReadLine() 
     Write-Host (" " * 14) ($line -eq $null) $reader.EndOfStream 
     } While ($line -ne $null) 
    $reader.Close() 

    'DO {} UNTIL ($line -eq $null)' 
    $reader = [System.IO.File]::OpenText("$journalPath\$journal") 
    Do { 
     $line = $reader.ReadLine() 
     Write-Host (" " * 14) ($line -eq $null) $reader.EndOfStream 
     } Until ($line -eq $Null) 
    $reader.Close() 

    'DO {} WHILE (-not $reader.EndOfStream)' 
    $reader = [System.IO.File]::OpenText("$journalPath\$journal") 
    Do { 
     $line = $reader.ReadLine() 
     Write-Host (" " * 14) ($line -eq $null) $reader.EndOfStream 
     } While (-not $reader.EndOfStream) 
    $reader.Close() 

    'DO {} UNTIL ($reader.EndOfStream)' 
    $reader = [System.IO.File]::OpenText("$journalPath\$journal") 
    Do { 
     $line = $reader.ReadLine() 
     Write-Host (" " * 14) ($line -eq $null) $reader.EndOfStream 
     } Until ($reader.EndOfStream) 
    $reader.Close() 

    'WHILE (-not $reader.EndOfStream) {}' 
    $reader = [System.IO.File]::OpenText("$journalPath\$journal") 
    While (-not $reader.EndOfStream) { 
     $line = $reader.ReadLine() 
     Write-Host (" " * 14) ($line -eq $null) $reader.EndOfStream 
    } 
    $reader.Close() 

    'FOREACH-OBJECT {}' 
    $journal | Get-Content -Encoding UTF8 | ForEach-Object { 
     Write-Host (" " * 14) ($_ -eq $null) 
    } 
} 

사람은 유일하게 허용되는 시나리오 'FOREACH-OBJECT {}''WHILE (-not $reader.EndOfStream) {}' 서브 헤더와 그 것을 볼 수 있습니다

PS D:\PShell> D:\PShell\SO\37898929.ps1 

      testing journal37898929-none_lines.txt 
DO {} WHILE ($line -ne $null) 
       True True 
DO {} UNTIL ($line -eq $null) 
       True True 
DO {} WHILE (-not $reader.EndOfStream) 
       True True 
DO {} UNTIL ($reader.EndOfStream) 
       True True 
WHILE (-not $reader.EndOfStream) {} 
FOREACH-OBJECT {} 

      testing journal37898929-some_lines.txt 
DO {} WHILE ($line -ne $null) 
       False False 
       False False 
       False True 
       True True 
DO {} UNTIL ($line -eq $null) 
       False False 
       False False 
       False True 
       True True 
DO {} WHILE (-not $reader.EndOfStream) 
       False False 
       False False 
       False True 
DO {} UNTIL ($reader.EndOfStream) 
       False False 
       False False 
       False True 
WHILE (-not $reader.EndOfStream) {} 
       False False 
       False False 
       False True 
FOREACH-OBJECT {} 
       False 
       False 
       False 

PS D:\PShell> 

추가 읽기 : PowerShell loops: For, Foreach, While, Do-Until, Continue, Break