PowerShell:将整个文本文件内容存储在变量中

xvw2m8pv  于 2023-03-23  发布在  Shell
关注(0)|答案(6)|浏览(168)

我想使用PowerShell将文本文件的 * 全部 * 内容(包括可能存在或不存在的尾随空行)存储在变量中。我还想知道文本文件中的总行数。最有效的方法是什么?

thtygnil

thtygnil1#

在PowerShell 3.0中,您可以将Get-Content cmdlet与新的Raw开关一起使用:

$text = Get-Content .\file.txt -Raw
bpsygsoo

bpsygsoo2#

要获取文件的全部内容:

$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
jv2fixgn

jv2fixgn3#

Powershell 2.0:

(see detailed explanation here)

$text = Get-Content $filePath | Out-String

IO.File.ReadAllText不适用于我的相对路径,它在%USERPROFILE%\$filePath中查找文件,而不是当前目录(至少在Powershell伊势中运行时):

$text = [IO.File]::ReadAllText($filePath)

Powershell 3+:

$text = Get-Content $filePath -Raw
lokaqttq

lokaqttq4#

还有一种阅读文件的方法,我碰巧喜欢被称为不同的 * 变量符号 * 或 * 变量语法 *,并且涉及简单地将filespec包含在前面有美元符号的花括号中,即:

$content = ${C:file.txt}

这个符号可以被用作an L-value or an R-value;因此,你可以很容易地写一个像这样的文件:

${D:\path\to\file.txt} = $content

另一个方便的用法是,您可以在不使用临时文件和子表达式的情况下就地修改文件,例如:

${C:file.txt} = ${C:file.txt} | select -skip 1

我最初对这个符号很着迷,因为很难找到关于它的任何东西!即使是PowerShell 2.0规范也只提到过一次,只显示了一行使用它-但根本没有解释或使用细节。我后来发现了PowerShell variables上的这篇博客文章,它提供了一些很好的见解。
最后一个使用注意事项:您必须使用驱动器名称,即${drive:filespec},正如我在上面所有示例中所做的那样。没有驱动器(例如${file.txt}),它无法工作。对该驱动器上的文件空间没有限制:它可以是绝对或相对的。

kfgdxczn

kfgdxczn5#

Get-Content抓取数据并将其逐行转储到数组中。假设除了您列出的要求之外没有其他特殊要求,您可以将内容保存到变量中吗?

$file = Get-Content c:\file\whatever.txt

只运行$file将返回完整的内容。然后您可以执行$file.Count(因为数组已经内置了count方法)以获得总行数。
希望这能帮到你!我不是一个脚本高手,但这对我来说似乎比上面的很多东西都要容易。

j0pj023g

j0pj023g6#

读取二进制文件:

这并不完全是所要求的,但有些人可能会发现这对他们的用例很有用。Get-Content -Raw产生string,所以如果你想要byte[]

Get-Content c:\file.bin -Encoding Byte -ReadCount 0

-Read-Count告诉一次有多少行通过管道(默认值为1),0在一个操作中完成所有操作,从而提高性能。
感谢Shay Levy发表了以下解决方案:(see Shay's post here)

相关问题