3

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

我发现了一篇关于使用-Rawswitch on的 SO 帖子Get-Content,但似乎此开关的文档含糊不清。当我使用-Raw开关,对其进行编码并将其发送回 API 时,格式很好。

4

2 回答 2

4

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

Get-Content[默认情况下] 逐行读取文件并返回行数组。Using-Raw将文件的全部内容作为单个字符串读取。

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

考虑到-Raw的实际目的,也许类似这样-Whole的名称会是一个更好的名称,但那艘船已经航行(尽管为参数添加别名仍然是一种选择)。

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


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

PowerShell 文档困境的故事

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

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

  • 然而,正如 briantist 也指出的那样,PowerShell 的文档现在是开源的,欢迎贡献;他说:
    “我会将您的注意力引向编辑链接 [ Get-ContentGitHub 上的帮助主题] [...],这样您就可以实际修复它并提交更好的内容(包括示例)。我以前做过;他们确实做到了接受它的拉取请求。”
    需要注意的是,虽然未来的 PowerShell Core版本将受益于改进,但尚不清楚改进是否会重新回到Windows PowerShell中。

让我们询问PowerShell 的内置帮助系统,可通过标准Get-Helpcmdlet 访问(其内容可能未预安装;在提示时安装,或Update-Help提升的会话运行):

Get-Help Get-Content -Parameter Raw

请注意如何方便地就特定参数( )寻求帮助。-Parameter Raw

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

-生的
  忽略换行符并在一个字符串中返回文件的全部内容。  
  默认情况下,文件的内容作为分隔的字符串数组返回  
  由换行符。
        
  Raw 是文件系统提供程序添加到 Get-Content cmdlet 的动态参数。  
  此参数仅适用于文件系统驱动器。
        
  此参数是在 Windows PowerShell 3.0 中引入的。

  必需的?错误的
  位置?命名为
  默认值
  接受管道输入?错误的
  接受通配符?错误的

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

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

-生的
    
    必需的?错误的
    位置?命名
    接受管道输入?错误的
    参数集名称(全部)
    别名 无
    动态的?真的

虽然元数据更详细——包括参数是动态的提示(见下文)——但关键是缺少对参数的描述

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

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

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

可悲的是,结果是和以前一样无益的反应。

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


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

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

  • 适用于所有提供者的通用方法。

  • 记录提供程序专有行为和参数的提供程序特定页面,例如-Raw文件系统提供程序。

可悲的是,通用主题没有提及提供者特定主题的存在,这使得它们很难被发现

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

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

然而,还有一线希望:前面提到的 404 页面提供了指向文件系统提供者特定主题的链接: Get-Content for FileSystem

在那里,我们最终发现了真正相关的、特定于提供商的信息的在线版本,这些信息与Get-Help Get-Content -Parameter Raw本地提供的信息相同,但如前所述,仅在Windows PowerShell中提供。

于 2018-03-02T23:21:00.913 回答
3

根据Kory Gill您自己的评论,内置文档Get-HelpMSDN 文档应该是您的第一站。但是您已经使用了 RTFM!

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

在此处获取内容页面。它有这样的说法-Raw

将多行作为单个字符串返回 (PowerShell 3.0)
在 PowerShell 2.0 中使用静态方法:[System.IO.File]::ReadAllText(string path)

于 2018-03-02T22:50:59.660 回答