我看到了一些奇怪的行为,我似乎无法解释。
这段用于流式传输文本文件的代码可以很好地工作。
$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行,我会得到
You cannot call a method on a null-valued expression.在第9行,$reader.ReadLine()行。为什么一个简单的Write-Line会有这样的影响呢?
发布于 2016-06-19 17:18:21
与(所谓的预测试) While () {…}循环不同,所有(所谓的posttest) Do {…} While ()以及Do {…} Until ()循环总是至少执行一次其代码块,因为条件发生在循环的末尾。
下一个示例展示了逐行循环文件内容的基本场景,包括inept场景,其中显示了在当前迭代/重复中,读取行是否可能计算为空值表达式。注意,您不需要调用.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> https://stackoverflow.com/questions/37898929
复制相似问题