【问题标题】:PowerShell: Store Entire Text File Contents in VariablePowerShell:将整个文本文件内容存储在变量中
【发布时间】:2016-04-19 06:17:31
【问题描述】:

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

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

    【讨论】:

    • 这应该是公认的答案。顺便说一句,我很确定 Get-Content 即使在早期版本中也能正常工作。
    • @MatteoSp Get-Content 做到了,但直到 3.0 才得到 -Raw。没有它,它会被存储为一个行数组。
    • 这绝对应该是公认的答案。 documentation 表示 -Raw 参数不是由任何本机实现的,这无济于事。
    • 谢谢,刚才帮了大忙。
    【解决方案2】:

    获取文件的全部内容:

    $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 在 .Net(和 windows)中,任何带有 \r\n 的行都将被计算在内。
    • 我正在做一些实验,并想出了与您更新的答案相同的东西,但如果没有您的帮助,我不会到达那里,所以非常感谢您!
    • 有没有办法透明地将它与Invoke-WebRequest结合起来?
    【解决方案3】:

    Powershell 2.0:

    (see detailed explanation here)

    $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))
    【解决方案4】:

    另一种我碰巧喜欢的读取文件的方法被称为变量表示法变量语法,只需将文件规范括在前面的花括号中一个美元符号,也就是说:

    $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}),它将无法工作。对该驱动器上的文件规范没有限制:它可以是绝对的或相对的。

    【讨论】:

    • 除非我在驱动器名称后加上反斜杠,否则我从来没有让它工作。
    • @CharlesAnderson:目前尚不清楚您指的是三个示例中的哪一个,或者可能是所有示例……但是,我刚刚确认所有三个示例都使用相对路径(即没有反斜杠) 在 PowerShell V3 中。此外,在我回答时,我使用的是 V2,所以可能还有其他原因导致您的环境出现问题。
    • 我的意思是像 ${C:file.txt} 这样的例子,我必须写成 ${C:\file.txt}。是的,我认为这与我的环境有关,但我不知道是什么。
    • 作为L值使用时,使用系统默认编码。我试图设置 $OutputEncoding 无效。当用作 R 值时,它会产生一个 string[] 数组。
    • 看来你只能使用文字路径名;您不能在其中使用变量或诸如 Join-Path 表达式之类的东西。这很烦人,因为当通过 ConvertTo-Json 传输时,与 Get-Content 相比存在天壤之别(${...} 结果是我所希望的。我不确定这是否相同作为 Get-Content | Out-String 虽然
    【解决方案5】:

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

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

    只运行$file 将返回完整内容。然后你可以只做$file.Count(因为数组已经内置了一个计数方法)来获得总行数。

    希望这会有所帮助!我不是脚本专家,但这对我来说似乎比上面的很多东西更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多