我有一个非常简单的脚本,它从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文件,文件存在。我确定我错过了一些东西,但不确定它是什么。任何帮助将不胜感激
答案 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
个实例的情况下导致输出不仅无用,而且混淆 - 见下文。
[System.Collections.IEnumerable]
个实例是可枚举的,它们的枚举元素(XML节点)也是可递归的。
[xml]
递归地枚举文档的顶级节点 - 这是单独的根元素,或者,如果存在,则是XML声明 - 并且总是命中一个或者更多 leaf 节点,其枚举总是为空并产生空字符串。
鉴于[xml]
将其(枚举的)输入对象的字符串化与每个空格分开,您可以获得空字符串或一个或多个空格作为总输出。