【发布时间】:2016-04-19 06:17:31
【问题描述】:
我想使用 PowerShell 将文本文件的 整个 内容(包括可能存在或不存在的尾随空行)存储在变量中。我还想知道文本文件中的总行数。最有效的方法是什么?
【问题讨论】:
标签: powershell
我想使用 PowerShell 将文本文件的 整个 内容(包括可能存在或不存在的尾随空行)存储在变量中。我还想知道文本文件中的总行数。最有效的方法是什么?
【问题讨论】:
标签: powershell
附带说明,在 PowerShell 3.0 中,您可以将 Get-Content cmdlet 与新的 Raw 开关一起使用:
$text = Get-Content .\file.txt -Raw
【讨论】:
Get-Content 做到了,但直到 3.0 才得到 -Raw。没有它,它会被存储为一个行数组。
-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) 做同样的事情。由于两者中的第二个较短,这就是我更喜欢的。不幸的是,您提供的用于计算总行数的方法都没有考虑尾随空白行。还有其他想法吗?
\r\n 的行都将被计算在内。
Invoke-WebRequest结合起来?
(see detailed explanation here)
$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))
另一种我碰巧喜欢的读取文件的方法被称为变量表示法或变量语法,只需将文件规范括在前面的花括号中一个美元符号,也就是说:
$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}),它将无法工作。对该驱动器上的文件规范没有限制:它可以是绝对的或相对的。
【讨论】:
Get-Content 获取数据并将其逐行转储到一个数组中。假设没有您列出的其他特殊要求,您可以将您的内容保存到变量中吗?
$file = Get-Content c:\file\whatever.txt
只运行$file 将返回完整内容。然后你可以只做$file.Count(因为数组已经内置了一个计数方法)来获得总行数。
希望这会有所帮助!我不是脚本专家,但这对我来说似乎比上面的很多东西更容易。
【讨论】: