PowerShell将Get-Content存储到变量中返回无数据

3
我有一个非常简单的脚本,它从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文件且文件存在。我确定我缺少某些内容,但不确定是什么。任何帮助将不胜感激。


1
如果文件夹中有多个文件,则$DataFile将是一个数组。我不确定Get-Content会如何处理它,但根据您所说的工作方式,它只获取所有文件的内容并将其传递到下一行。在这种情况下,此时它将不是有效的XML。文件夹中是否有多个文件? - EBGreen
2个回答

4

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

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

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

这对于使用write-output也是一个好主意。


2
避免使用 Write-Host 的另一个原因是,你不需要使用 Write-Output。你可以将其放在单独的一行上,它就能实现相同的效果:$x.InnerXml - Maximilian Burszley
我只是写了这个来增加冗长度,因为我认为它们实现了相同的功能。 - Jacob Colvin
1
这里没有“我相信”,它们确实做着相同的事情。 - Maximilian Burszley
在没有提到它们的作用完全不同的情况下,将Write-Output作为Write-Host的替代方案并不是一个好主意。在将对象传递给Write-Host之前,没有严格的需要将其转换为字符串,但是与非字符串一起使用可能会导致几乎无用或甚至令人困惑的输出,就像这种情况(空白或空),因为Write-Host执行.ToString()格式化与(潜在的递归)枚举相结合。但是,请注意,即使是[隐含的]Write-Output对于[xml]实例也只产生略微更有帮助的输出。 - mklement0
哦,我之前使用了 InnterText 而不是 InnerXml - sommmen

0
首先,Write-Host 在一般情况下有很少的合法用途 - 不要使用它来输出数据: Write-Host 的输出直接进入控制台,因此既不能通过管道发送,也不能捕获或重定向(松散地说;有关完整的故事,请参见我的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

注意:[xml]实例恰好具有半友好的默认输出格式,不提供有关文档结构的任何见解;要查看后者,请访问.OuterXml属性,但您可能还想应用漂亮的打印,这需要更多的工作。


Write-Host 输出与 Out-Host 和隐式 / Write-Output 输出不同,它会将内容直接输出到控制台:

  • Write-Host 不会应用 PowerShell 的默认输出格式,而是在其输入上调用 .ToString() 方法,这会导致不同的、通常几乎无用的表示方式 - 特别是对于 字符串 输入。

  • 此外,Write-Host 会对可枚举的输入对象进行 枚举,以便给定输入对象的 元素单独 字符串化。
    如果一个输入对象实现了 [System.Collections.IEnumerable] 接口,则认为它是可枚举的。
    这种枚举是 递归 进行的,在 [xml] 实例的情况下,结果输出不仅是 无用的,而且还会 混淆 - 请参见下文。

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

Write-Host 递归枚举文档的顶级节点 - 这可以是仅根元素,或者如果存在,则还包括 XML 声明 - 并总是命中一个或多个叶子节点,其枚举总是为空并产生空字符串。 鉴于 Write-Host 使用每个空格分隔其(枚举的)输入对象的字符串化,因此您将获得空字符串或一个或多个空格作为整体输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接