2012-03-30 4 views
2

Я пытаюсь сохранить информацию, собранную о локальном компьютере, в XML-файл. Кажется, что все работает нормально, но я получаю эту ошибку в отношении строк, которые могут быть установлены как свойства XmlNode, но, например:Ошибка строки при сохранении переменных в xml

Любые идеи о том, как их решить?

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 
+0

Если вы делаете $ _. Имя | Get-Member, что это за тип? – EBGreen

+0

Я думаю, что это $ null ... –

+0

Я думаю, что вы, вероятно, правы. Возможно, это будет String [] или другая коллекция. – EBGreen

ответ

3

Я тестировал этот код (за исключением последних 2-х строк), и я должен бросить

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

как [string]

но все мои объемы получили название (a: c: d: e: f: g: and so on...)

Может быть, что некоторые демонтирован объем присутствует в системе, вы тестирование?

Try бросить также

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

Здесь результат после расстрелов коды добавления ролей:

Powershell Console

Где не gwmi возвращать никакого значения, я была ошибка без броска к [string]

Смежные вопросы