首页 > 解决方案 > 在 PowerShell 中检查文件中的最后一行是否为空

问题描述

我想在新行中向文件添加一些内容。但add-content如果末尾没有换行符,则将字符串附加到最后一行。

例如,如果我想添加AAA字符串并且我有一个文件file1.txt

my last line(last cursor position here)

结果将是

my last lineAAA

另一方面,如果我使用file2.txt

my last line
(last cursor position here)

该命令将导致

my last line
AAA

所以我需要检查最后一行是否为空。如果它不为空,我将在字符串中添加 `n 符号。

但是如果我运行命令

$lastLine = get-content $filename -Tail 1
if($lastLine.Length -ne 0) { ... } 

即使我的最后一行不包含符号,它也会始终返回一个非空字符串的长度。如何检查我的最后一行是否为空?

标签: powershell

解决方案


当您使用“Get-Content -Tail 1”时,它将始终恢复最后一个“非空”行。

# -----------------
# Your method returns the same line even if the file contains an empty line at the end of the file
# -----------------
$lastEmptyLine = Get-Content "test_EmptyLine.txt" -Tail 1
$lastNonEmptyLine = Get-Content "test_NonEmptyLine.txt" -Tail 1

($lastEmptyLine -match '(?<=\r\n)\z')
#False
($lastNonEmptyLine -match '(?<=\r\n)\z')
#False

因此,如果您想保留“测试”方法(而不仅仅是使用 Add-Content),您可以使用以下方法:

# -----------------
# This method can tell you if a file finishes by an empty line or not
# -----------------
$contentWithEmptyLine = [IO.File]::ReadAllText("test_EmptyLine.txt")
$contentWithoutEmptyLine = [IO.File]::ReadAllText("test_NonEmptyLine.txt")

($contentWithEmptyLine -match '(?<=\r\n)\z')
#True
($contentWithoutEmptyLine -match '(?<=\r\n)\z')
#False

# -----------------
# You can also use Get-Content with Raw option
# -----------------
$rawContentWithEmptyLine = Get-Content "test_EmptyLine.txt" -Raw
$rawContentWithoutEmptyLine = Get-Content "test_NonEmptyLine.txt" -Raw

($rawContentWithEmptyLine -match '(?<=\r\n)\z')
#True
($rawContentWithoutEmptyLine -match '(?<=\r\n)\z')
#False

-Raw忽略换行符并在一个字符串中返回文件的全部内容,并保留换行符。默认情况下,文件中的换行符用作分隔符将输入分隔为字符串数组。此参数是在 PowerShell 3.0 中引入的。

参考 :

获取内容 (Microsoft.PowerShell.Management)

检查每个文件末尾的 CRLF

about_Comparison_Operators - PowerShell

正则表达式 - 维基百科


推荐阅读