我想使用PowerShell将文本文件的全部内容(包括可能存在或不存在的尾随空行)存储在变量中。我还想知道文本文件中的总行数。最有效的方法是什么?
我想使用PowerShell将文本文件的全部内容(包括可能存在或不存在的尾随空行)存储在变量中。我还想知道文本文件中的总行数。最有效的方法是什么?
顺便说一下,在PowerShell 3.0中,你可以使用新的Raw开关,使用Get-Content
命令:
$text = Get-Content .\file.txt -Raw
获取文件的全部内容:
$content = [IO.File]::ReadAllText(".\test.txt")
行数:
([IO.File]::ReadAllLines(".\test.txt")).length
或者(gc .\test.ps1).length
搞一些技巧性的操作才能包含尾随的空行:
[io.file]::ReadAllText(".\desktop\git-python\test.ps1").split("`n").count
$content = [IO.File]::ReadAllText(".\test.txt")
看起来与 $content = (gc ".\test.txt" | out-string)
做的事情一样。由于后者更短,所以我更喜欢它。不幸的是,你提供的两种计算总行数的方法都没有考虑到末尾的空白行。还有其他想法吗? - Nick\r\n
的行都会被计算。 - manojldsInvoke-WebRequest
结合的方法? - Kareem$text = Get-Content $filePath | Out-String
IO.File.ReadAllText
对于相对路径不起作用,它在%USERPROFILE%\$filePath
中查找文件,而不是当前目录(至少在从Powershell ISE运行时):
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
[IO.File]::ReadAllText((Resolve-Path $filePath))
。 - mvanle我喜欢的另一种文件读取方法被称为变量符号或变量语法,它只需要在花括号内用美元符号括起来即可,例如:
$content = ${C:file.txt}
这种符号表示可以作为L值或R值使用;因此,您可以像这样轻松地写入文件:
${D:\path\to\file.txt} = $content
另一个方便的用途是,您可以在不使用临时文件和子表达式的情况下直接修改文件,例如:
${C:file.txt} = ${C:file.txt} | select -skip 1
${drive:filespec}
。如果没有驱动器(例如${file.txt}
),它将无法正常工作。对该驱动器上的文件规范没有限制:它可以是绝对路径或相对路径。$file = Get-Content c:\file\whatever.txt
只需运行$file
即可返回完整内容。然后您只需执行$file.Count
(因为数组已经内置了计数方法)以获取总行数。
希望这有所帮助!我不是一个脚本专家,但这对我来说似乎比上面的很多东西更容易。
虽然这不完全符合要求,但也许有些人会发现这对他们的用例很有用。 Get-Content -Raw
返回一个 string
,所以如果你想要 byte[]
:
Get-Content c:\file.bin -Encoding Byte -ReadCount 0
-Read-Count
表示一次处理管道中的多少行(默认为1),而0则会在一次操作中完成所有操作,从而提高性能。
这个解决方案的功劳应归于Shay Levy,他发表了这篇文章:(在这里查看Shay的帖子)
Get-Content
命令在3.0版本之前默认获取的是一行一行的文本,并且以数组形式存储。但在3.0版本中加入了-Raw
参数,可以直接以字符串形式获取全部内容。 - jpmc26-Raw
参数没有被任何本地实现。 - Richard Szalay