我想使用PowerShell将文本文件的 * 全部 * 内容(包括可能存在或不存在的尾随空行)存储在变量中。我还想知道文本文件中的总行数。最有效的方法是什么?
thtygnil1#
在PowerShell 3.0中,您可以将Get-Content cmdlet与新的Raw开关一起使用:
Get-Content
$text = Get-Content .\file.txt -Raw
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
jv2fixgn3#
(see detailed explanation here)
$text = Get-Content $filePath | Out-String
IO.File.ReadAllText不适用于我的相对路径,它在%USERPROFILE%\$filePath中查找文件,而不是当前目录(至少在Powershell伊势中运行时):
IO.File.ReadAllText
%USERPROFILE%\$filePath
$text = [IO.File]::ReadAllText($filePath)
$text = Get-Content $filePath -Raw
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}),它无法工作。对该驱动器上的文件空间没有限制:它可以是绝对或相对的。
${drive:filespec}
${file.txt}
kfgdxczn5#
Get-Content抓取数据并将其逐行转储到数组中。假设除了您列出的要求之外没有其他特殊要求,您可以将内容保存到变量中吗?
$file = Get-Content c:\file\whatever.txt
只运行$file将返回完整的内容。然后您可以执行$file.Count(因为数组已经内置了count方法)以获得总行数。希望这能帮到你!我不是一个脚本高手,但这对我来说似乎比上面的很多东西都要容易。
$file
$file.Count
j0pj023g6#
这并不完全是所要求的,但有些人可能会发现这对他们的用例很有用。Get-Content -Raw产生string,所以如果你想要byte[]:
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)
-Read-Count
6条答案
按热度按时间thtygnil1#
在PowerShell 3.0中,您可以将
Get-Content
cmdlet与新的Raw开关一起使用:bpsygsoo2#
要获取文件的全部内容:
行数:
或
这是一种包含尾随空行的黑客行为:
jv2fixgn3#
Powershell 2.0:
(see detailed explanation here)
IO.File.ReadAllText
不适用于我的相对路径,它在%USERPROFILE%\$filePath
中查找文件,而不是当前目录(至少在Powershell伊势中运行时):Powershell 3+:
lokaqttq4#
还有一种阅读文件的方法,我碰巧喜欢被称为不同的 * 变量符号 * 或 * 变量语法 *,并且涉及简单地将filespec包含在前面有美元符号的花括号中,即:
这个符号可以被用作an L-value or an R-value;因此,你可以很容易地写一个像这样的文件:
另一个方便的用法是,您可以在不使用临时文件和子表达式的情况下就地修改文件,例如:
我最初对这个符号很着迷,因为很难找到关于它的任何东西!即使是PowerShell 2.0规范也只提到过一次,只显示了一行使用它-但根本没有解释或使用细节。我后来发现了PowerShell variables上的这篇博客文章,它提供了一些很好的见解。
最后一个使用注意事项:您必须使用驱动器名称,即
${drive:filespec}
,正如我在上面所有示例中所做的那样。没有驱动器(例如${file.txt}
),它无法工作。对该驱动器上的文件空间没有限制:它可以是绝对或相对的。kfgdxczn5#
Get-Content抓取数据并将其逐行转储到数组中。假设除了您列出的要求之外没有其他特殊要求,您可以将内容保存到变量中吗?
只运行
$file
将返回完整的内容。然后您可以执行$file.Count
(因为数组已经内置了count方法)以获得总行数。希望这能帮到你!我不是一个脚本高手,但这对我来说似乎比上面的很多东西都要容易。
j0pj023g6#
读取二进制文件:
这并不完全是所要求的,但有些人可能会发现这对他们的用例很有用。
Get-Content -Raw
产生string
,所以如果你想要byte[]
:-Read-Count
告诉一次有多少行通过管道(默认值为1),0在一个操作中完成所有操作,从而提高性能。感谢Shay Levy发表了以下解决方案:(see Shay's post here)