【问题标题】:String error when saving variables to xml将变量保存到 xml 时出现字符串错误
【发布时间】:2012-04-14 05:16:23
【问题描述】:

我正在尝试将收集到的有关本地计算机的信息保存到 XML 文件中。一切似乎都运行良好,但我得到这个关于字符串只能被设置为 XmlNode 属性的错误,但是例如:

关于如何解决它的任何想法?

PS C:\Users\Hkon> $newdrive.name = $_.name

导致此错误:

Cannot set "name" because only strings can be used as values to set XmlNode properties.
At line:1 char:11
+ $newdrive. <<<< name = $_.name
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

这是我的代码:

$template = "<computer version='1.0'>
    <hardware>
        <serialnr>$serialnr</serialnr>
        <systeminfo>
            <name></name>
            <domain></domain>
            <manufacturer></manufacturer>
            <model></model>
            <bitversion></bitversion>
        </systeminfo>
        <usb>
            <model></model>
        </usb>
        <drive>
            <name></name>
            <volumename></volumename>
            <size></size>
            <freespace></freespace>
        </drive>
        <memory>
            <positioninrow></positioninrow>
            <capacity></capacity>
            <datawidth></datawidth>
            <devicelocator></devicelocator>
        </memory>
        <gpu>
            <name>$gpu</name>
            <status>$status</status>
        </gpu>
        <cpu>
            <name></name>
            <manufacturer></manufacturer>
            <id></id>
            <numberofcores></numberofcores>
            <addresswidth></addresswidth>
        </cpu>
    </hardware>
    <software>
        <printer>
            <id></id>
            <drivername></drivername>
            <portname></portname>
        </printer>
        <allusers>
            <user>
                <name></name>
            </user>
        </allusers>
        <osinfo>
            <caption></caption>
            <serialnr></serialnr>
            <bitversion></bitversion>
            <installdate>$NormalDateTime</installdate>
            <manufacturer></manufacturer>
        </osinfo>
    </software>
</computer>"

$template | out-File C:\Scripts\XML\info.xml
$xml = New-Object xml
$xml.Load("C:\Scripts\XML\info.xml")

#Drive, hardware
$newdrive = (@($xml.computer.hardware.drive)[0])

Get-WmiObject -Class Win32_logicaldisk |
ForEach-Object {
    $newdrive = $newdrive.clone()
    $newdrive.name = $_.name
    $newdrive.volumename = $_.volumename
    $newdrive.size = $_.size
    $newdrive.freespace = $_.freespace.toString()
    $xml.computer.hardware.AppendChild($newdrive) > $null
}
$xml.computer.hardware.drive | where-object {$_.name -eq ""} | foreach-object {$xml.computer.hardware.RemoveChild($_)}
$xml.computer.hardware.drive.Count

【问题讨论】:

  • 如果你这样做 $_.Name | Get-Member,它是什么类型的?
  • 我猜你可能是对的。也可能是 String[] 或其他一些集合。

标签: xml string powershell


【解决方案1】:

我已经测试了这段代码(不包括最后两行),我必须强制转换

$_volumename, $_.size, and $_.frespace 

作为[string]

但我所有的卷都有一个名字 (a: c: d: e: f: g: and so on... )

您正在测试的系统中可能存在一些未安装的卷吗?

也尝试投射

$newdrive.name = [string]$_.name 

执行代码添加演员后的结果如下:

gwmi 没有返回值我在没有强制转换为 [string] 的情况下出错

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多