Get-Content 中的 -raw 开关参数在 Powershell 中的真正作用是什么?查找有用的文档

What does the -raw switch parameter in Get-Content really do in Powershell? Finding helpful documentation

我一直在尝试使用 API,它只接受 JSON 对象中的原始文本或 base64 编码值。我发布的内容是来自 XML 文件的数据。所以我使用 Powershell 的 Get-Content cmdlet(没有 -Raw)从 .xml 中检索数据,然后对其进行 base64 编码并将其发送到 API。 API 然后对其进行解码,但是 XML 格式丢失了。

我找到了关于在 Get-Content 上使用 -Raw 开关的 SO post,但似乎此开关的文档含糊不清。当我使用 -Raw 开关时,对其进行编码并将其发送回 API,格式很好。

根据 and , the built-in Get-Help and MSDN documentation 应该是您的第一个停靠港。但是你已经 RTFM 了!

如果失败,ss64 是 Powershell 文档和其他示例的重要参考。

Get-Content page here。关于 -Raw:

Return multiple lines as a single string (PowerShell 3.0)
In PowerShell 2.0 use the static method: [System.IO.File]::ReadAllText(string path)

briantist 对问题的有用评论总结了 答案 简洁(用他的话说;轻微编辑,强调):

Get-Content [by default] reads a file line by line and returns an array of the lines. Using -Raw reads the entire contents of the file as a single string.

名称 -Raw 有点不幸,因为它错误地建议阅读原始 字节 ,而 -Raw仍然检测编码并最终将所有内容读入 .NET [string] 类型。
(相比之下,您需要 -Encoding Byte (Windows PowerShell) 或 -AsByteStream (PowerShell Core) 才能将文件读取为 字节数组 。)

考虑到 -Raw 的实际用途,也许像 -Whole 这样的名字会更好,但是那艘船已经起航了(尽管添加了 别名 对于参数仍然是一个选项)。

让我们来看看为什么这些信息目前可能很难发现 [更新:它不再是]:


[更新:本部分现在已过时,除了 PowerShell 文档 GitHub 存储库的 link,它欢迎贡献, 错误报告, 建议]

PowerShell 文档问题的故事

这个故事的中心冲突是 PowerShell 的 潜在 强大的帮助系统的坚实 基础 与其伪劣的当前 内容.

  • 通常情况下,第三方会来救援,如答案所示。

  • 然而,正如 briantist 也指出的那样,PowerShell's documentation is now open-source 并欢迎贡献;他说:
    “我会将您的注意力引向 Edit link [对于 GitHub 上的 Get-Content 帮助主题] [...] 这样你就可以实际修复它并提交更好的东西 (包括示例)。我以前做过;他们确实接受拉 请求它。
    需要注意的是,虽然未来的 PowerShell Core 版本将受益于改进,但尚不清楚改进是否会回到 Windows PowerShell.

让我们询问 PowerShell 的 built-in 帮助系统,可通过标准 Get-Help cmdlet(content 可能未预安装;出现提示时安装,或 运行 Update-Help 来自 elevated 会话):

Get-Help Get-Content -Parameter Raw

请注意如何您可以方便地寻求有关特定参数的帮助 (-Parameter Raw)。

Windows PowerShell v5.1 上,这会产生:

-Raw 
  Ignores newline characters and returns the entire contents of a file in one string.  
  By default, the contents of a file is returned as a array of strings that is delimited  
  by the newline character.
        
  Raw is a dynamic parameter that the FileSystem provider adds to the Get-Content cmdlet.  
  This parameter works only in file system drives.
        
  This parameter is introduced in Windows PowerShell 3.0.

  Required?                    false
  Position?                    named
  Default value
  Accept pipeline input?       false
  Accept wildcard characters?  false

这确实是我们正在寻找的并且非常有帮助(将尴尬的措辞“由换行符分隔”放在一边,在 Windows 上换行符是一个字符 sequence).

Powershell Core v6.0.2 上,这会产生:

-Raw
    
    Required?                    false
    Position?                    Named
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      None
    Dynamic?                     true

虽然 meta-data 更详细 - 包括参数是 动态 的提示(见下文) - 它至关重要 缺少 参数说明

一些 provider-cmdlet 参数是 动态的 ,因为它们是 特定的对于给定的提供者,因此有一种机制可以在寻求帮助时指定目标提供者通过将 provider-specific 示例路径传递给 -Path 参数

在手头的情况下,让我们尝试(Windows 上的 PowerShell Core):

Get-Help Get-Content -Parameter Raw -Path C:\

遗憾的是,结果和以前一样毫无帮助。

请注意,只要您从 文件系统 位置调用命令,显式使用 -Path 就应该 而不是 是必需的,因为 当前位置 的底层提供者是隐式目标。


现在让我们看一下在线版本的PowerShell帮助主题:

事实证明,给定的提供程序 cmdlet 可以有 多个 文档页面:

  • 适用于所有 提供商的通用

  • Provider-specific 记录 provider-exclusive 行为和参数的页面,例如文件系统提供程序的 -Raw

遗憾的是,通用主题没有提及 provider-specific 的存在,使它们 很难发现.

  • 谷歌搜索 Get-Content 带你到 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content, generic 主题,其中包含以下误导性陈述:This parameter is not supported by any providers that are installed with Windows PowerShell.

    • 这不仅没有帮助,而且会积极地误导,因为 PowerShell file-system 提供程序显然 与 PowerShell 一起安装并且 支持 -Raw.
      [驱动器] 提供程序是 PowerShell 对文件系统驱动器隐喻的概括,以支持针对其他 [通常是分层的具有一组统一的 cmdlet 的存储系统。例如,Windows PowerShell 还附带 registry 驱动器提供程序,它允许像管理驱动器一样管理注册表。
  • Get-Help-Online 开关方便地允许在 中打开请求主题的在线版本浏览器;所以让我们试试 (Get-Help Get-Content -Online):

    • Windows PowerShell v5.1:带你 a 404 page(!) related to v4.

    • PowerShell Core v6.0.1:将您带到与谷歌搜索相同的通用主题。

然而,还有一线希望:上述 404 页面提供了 link 文件系统-provider-specific 主题: Get-Content 文件系统

在那里,我们终于发现了真正相关的在线版本,provider-specific 信息,与 Get-Help Get-Content -Parameter Raw 在本地提供的信息相同,但是 - 如前所述 - 仅在 Windows PowerShell.