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


118

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

Answers:


122

要获取文件的全部内容:

$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

1
谢谢!$content = [IO.File]::ReadAllText(".\test.txt")似乎做与$content = (gc ".\test.txt" | out-string)。由于两者中的第二个较短,所以这是我更喜欢的。不幸的是,您提供的用于计算总行数的方法均未考虑尾随空白行。还有其他想法吗?
尼克,

@Nick在.Net(和Windows)中,任何行都\r\n将被计数。
manojlds 2011年

我正在做一些实验,并想出了与您更新后的答案相同的东西,但是如果没有您的帮助我不会到达那里,所以非常感谢!
尼克,

有没有办法透明地将其与Invoke-WebRequest
Kareem

189

附带说明一下,在PowerShell 3.0中,可以将Get-Contentcmdlet与新的Raw开关一起使用:

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

3
这应该是公认的答案。顺便说一句,我很确定Get-Content甚至在较早的版本中也能正常工作。
MatteoSp'5

10
@MatteoSp Get-Content做到了,但是直到3.0才实现了-Raw。没有它,它将被存储为行数组。
jpmc26 2016年

这绝对是公认的答案。该文档说该-Raw参数未由任何本机实现,这无济于事。
理查德·萨雷

谢谢,这是一个很大的帮助。
DAhrens

24

Powershell 2.0:

(请参阅此处的详细说明)

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

IO.File.ReadAllText没有为我使用相对路径的工作,它看起来在文件中%USERPROFILE%\$filePath,而不是当前目录(至少从PowerShell ISE中运行时):

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

Powershell 3+:

$text = Get-Content $filePath -Raw

要使用亲戚路径,请先解决,例如:[IO.File]::ReadAllText((Resolve-Path $filePath))
mvanle 2015年

13

读取我碰巧喜欢的文件的另一种方法被称为可变符号可变语法,并且涉及将文件规范简单地用大括号括起来并加一个美元符号,例如:

$content = ${C:file.txt}

该符号可以用作L值或R值;因此,您可以像下面这样轻松地写入文件:

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

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

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

最初,我对这种表示法很着迷,因为很难找到关于它的任何信息!甚至PowerShell 2.0规范也只提到一次,仅显示使用它的一行,而根本没有说明或使用细节。随后,我在PowerShell变量上找到了此博客条目,它提供了一些很好的见解。

关于此操作的最后一点说明:必须使用驱动器名称,即,${drive:filespec}如我在以上所有示例中所做的那样。没有驱动器(例如${file.txt}),它将无法工作。该驱动器上的filespec不受任何限制:它可以是绝对的或相对的。


除非在驱动器名称后加反斜杠,否则我永远都不会这样做。
查尔斯·安德森

@CharlesAnderson:目前尚不清楚您所指的是三个示例中的哪一个,或者可能是所有示例……不过,我只是确认了这三个示例在PowerShell V3中均使用相对路径(即,没有反斜杠)。此外,在我回答问题时,我正在使用V2,因此可能还有其他原因导致您的环境出现问题。
迈克尔·索伦斯

我的意思是像$ {C:file.txt}这样的示例,我必须将其写为$ {C:\ file.txt}。是的,我认为这与我的环境有关,但是我不知道该怎么办。
查尔斯·安德森

当用作L值时,它使用系统的默认编码。我试图将$ OutputEncoding设置为无效。当用作R值时,它会生成一个string []数组。
robert4

看来您只能使用文字路径名;您不能在其中使用变量或类似Join-Path表达式的内容。令人讨厌的是,因为通过ConvertTo-Json传递管道时,与Get-Content相比存在很大的差异(而$ {...}结果正是我所希望的。我不确定这是否相同as Get-Content | Out-String尽管如此
Cameron Kerr

2

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

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

只运行$file将返回全部内容。然后,您可以做$file.Count(因为数组已经内置了count方法)来获取总行数。

希望这可以帮助!我不是脚本编写向导,但是对我来说,这比上面的许多事情要容易得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.