首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Write-Host注释的奇怪副作用

Write-Host注释的奇怪副作用
EN

Stack Overflow用户
提问于 2016-06-19 00:00:14
回答 1查看 96关注 0票数 1

我看到了一些奇怪的行为,我似乎无法解释。

这段用于流式传输文本文件的代码可以很好地工作。

代码语言:javascript
复制
$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()
}

但是,如果我删除Write-Host行,我会得到

代码语言:javascript
复制
You cannot call a method on a null-valued expression.

在第9行,$reader.ReadLine()行。为什么一个简单的Write-Line会有这样的影响呢?

EN

回答 1

Stack Overflow用户

发布于 2016-06-19 17:18:21

与(所谓的预测试) While () {…}循环不同,所有(所谓的posttest) Do {…} While ()以及Do {…} Until ()循环总是至少执行一次其代码块,因为条件发生在循环的末尾。

下一个示例展示了逐行循环文件内容的基本场景,包括inept场景,其中显示了在当前迭代/重复中,读取行是否可能计算为空值表达式。注意,您不需要调用.NET File Class [System.IO.File]

代码语言:javascript
复制
$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 ) {}'子头的场景才是可接受的:

代码语言:javascript
复制
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> 

进一步阅读:: For, Foreach, While, Do-Until, Continue, Break

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37898929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档