【问题标题】:PowerShell storing Get-Content into variable returns no dataPowerShell 将 Get-Content 存储到变量中不返回数据
【发布时间】:2018-05-25 12:45:19
【问题描述】:

我有一个非常简单的脚本,它可以从 XML 文件中获取内容并返回它,但它不起作用:

$DataFile = Get-ChildItem \\$Server\C$\ *.data -Name
[xml]$DataFileContent = Get-Content Microsoft.PowerShell.Core\FileSystem::\\$Server\C$\$DataFile
Write-Host $DataFileContent

此脚本没有返回写入主机上的任何数据,但以下是返回正确的数据:

$DataFile = Get-ChildItem \\$Server\C$\ *.data -Name
Get-Content Microsoft.PowerShell.Core\FileSystem::\\$Server\C$\$DataFile

是的,该文件是一个 xml 文件并且该文件存在。我确定我错过了一些东西,但不确定它是什么。任何帮助将不胜感激

【问题讨论】:

  • 如果文件夹中有多个文件,则 $DataFile 将是一个数组。我不确定 Get-Content 将如何处理该问题,但根据您所说的工作原理,它只会获取所有文件的内容并将其传递下去。在这种情况下,它将不是有效的 XML。文件夹中是否有超过 1 个文件?

标签: xml powershell


【解决方案1】:

您不能在此处使用Write-Host,因为您正在尝试显示[xml] 对象。请改用write-output

如果需要Write-Host,则需要事先将对象表示为字符串或使用输出字符串的属性。例如:

[xml]$x = Get-Content y.xml
Write-Host $x.InnerXml

这也可能是与写入输出一起使用的好主意。

【讨论】:

  • 避免Write-Host 的另一个原因。但是,您不需要使用 Write-Output。您可以将其保留在自己的行中,并且可以实现相同的目的:$x.InnerXml
  • 我写这些只是为了增加冗长,因为我相信他们完成了同样的事情
  • 这里没有I believe,他们做同样的事情。
  • Write-Output 作为Write-Host 的替代品而不提及它们的用途非常不同,这不是一个好主意。在将对象传递给Write-Host 之前,没有严格需要将它们转换为字符串,但是与非字符串一起使用确实会导致几乎无用甚至完全混乱的输出,就像在这种情况下(空或空白)一样,因为@ 987654333@ 执行.ToString() 格式结合(可能是递归的)枚举。但是,请注意,即使是 [隐含] Write-Output 也只会为 [xml] 实例产生稍微有用的输出。
  • 嗯 - 我使用 InnterText 而不是 InnerXml
【解决方案2】:

第一件事:Write-Host 通常很少有合法用途 - 不要使用它来输出数据Write-Host' s 输出直接到 console,因此既不能通过管道发送,也不能捕获,也不能重定向(粗略地说;有关完整故事,请参阅我的 this answer 的最后一部分)。

如果您的意图是打印对象的友好表示仅供显示,请使用Out-Host 而不是Write-Host,因为后者会应用 PowerShell 常用的、友好的输出格式。

$DataFileContent | Out-Host # print object *for display only*

如果您的意图是输出数据,您可以依赖 PowerShell 的隐式输出行为,它会发送任何未明确捕获的输出或重定向到成功输出流,默认情况下使用友好格式打印到控制台:

$DataFileContent # same as: Write-Output $DataFileContent

很少需要显式使用Write-Output一个值得注意的例外是,如果您想将集合作为单个对象输出,请使用-NoEnumerate。 p>

注意:[xml] 的实例碰巧只有半友好的默认输出格式,无法深入了解文档结构;要查看后者,请访问 .OuterXml 属性,但您可能还需要应用漂亮打印,这需要更多工作。


Write-Host 输出不同于 Out-Host 和隐式 /Write-Output 输出,打印到控制台如下:

  • Write-Host 实质上不是应用 PowerShell 的默认输出格式,而是在其输入上调用 .ToString() 方法,这会导致不同的、通常几乎无用的表示 - 除了 string em> 输入。

  • 此外,Write-Host枚举输入对象(如果适用),以便给定输入对象的元素单独字符串化.
    如果输入对象实现了[System.Collections.IEnumerable] 接口,则认为它是可枚举的。
    这个枚举发生递归,在[xml] 实例的情况下,输出不仅无用,而且令人困惑 - 见下文.

[xml] 实例代表 XML 文档,是可枚举的,它们的枚举元素(XML 节点)也是递归的

Write-Host 递归地 枚举文档的顶级节点——要么是根元素本身,要么是额外的,如果存在的话,XML 声明——并且总是命中一个或多个 leaf 节点,其枚举总是 empty 并产生空字符串。 鉴于Write-Host 将其(枚举的)输入对象的字符串化与每个空格分开,您要么得到空字符串,要么得到一个或多个空格作为整体输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2012-02-19
    • 1970-01-01
    • 2015-06-11
    • 2013-04-24
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多