将Get-Content存储到变量中的PowerShell不返回任何数据

时间:2018-05-24 16:37:37

标签: xml powershell

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

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

此脚本不会在Write-Host上返回任何数据,但以下内容将返回正确的数据:

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

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

2 个答案:

答案 0 :(得分:3)

由于您尝试显示Write-Host对象,因此无法在此使用[xml]。请改为write-output

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

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

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

答案 1 :(得分:0)

首先要做的事情: Write-Host一般没有合法用途 - 使用它来输出数据:{{ 1}}的输出直接进入控制台,因此既不能通过管道发送,也不能捕获,也不能重定向(松散地说;完整的故事,请参阅{{3的最后一部分)我的。)

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

Write-Host

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

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

很少需要明确使用$DataFileContent # same as: Write-Output $DataFileContent 一个值得注意的例外是,如果您想使用{{1}将集合输出为单个对象 }。

注意:Write-Output的实例碰巧只有半友好的默认输出格式,不能提供对文档结构的深入了解;要查看后者,请访问-NoEnumerate属性,但您可能还需要应用漂亮打印,这需要更多工作。

[xml]输出与.OuterXml和隐式/ Write-Host输出不同,后者按如下方式打印到控制台:

  • Out-Host不是应用PowerShell的默认输出格式,而是基本上在其输入上调用Write-Output方法,这导致了不同的,通常几乎无用的表示 - 除了字符串输入。

  • 此外,Write-Host 枚举输入对象(如果适用),以便给定输入对象的元素单独 字符串化。
    如果输入对象实现.ToString()接口,则认为该输入对象是可枚举的 这个枚举发生递归,在Write-Host个实例的情况下导致输出不仅无用,而且混淆 - 见下文。

表示XML文档的

[System.Collections.IEnumerable]个实例是可枚举的,它们的枚举元素(XML节点)也是可递归的

[xml] 递归地枚举文档的顶级节点 - 这是单独的根元素,或者,如果存在,则是XML声明 - 并且总是命中一个或者更多 leaf 节点,其枚举总是为空并产生空字符串。 鉴于[xml]将其(枚举的)输入对象的字符串化与每个空格分开,您可以获得空字符串或一个或多个空格作为总输出。