Как написать XML файл с l oop в PowerShell? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть файл .sfu, я хотел бы проверить сумму и получить некоторую информацию для записи в файл XML. Я пытаюсь таким образом, но все еще не могу получить ожидаемый xml файл.

$File = Get-ChildItem -Path .\*B01-A1* -Filter *.sfu

$Path = ".\SUM.xml"

# get an XMLTextWriter to create the XML
$XmlWriter = New-Object System.XMl.XmlTextWriter($Path,$Null)

# choose a pretty formatting:
$xmlWriter.Formatting = 'Indented'
$xmlWriter.Indentation = 1
$XmlWriter.IndentChar = "`t"

# write the header
$xmlWriter.WriteStartDocument()

# create root element
$XmlWriter.WriteComment('System Information')
$xmlWriter.WriteStartElement('Data Details')

Foreach ($f in $File)
{
    $GetHash = Get-FileHash $f -Algorithm SHA256
    $HASH = $GetHash.HASH
    $size = $f.Length
    # add three pieces of information:
    $xmlWriter.WriteElementString('Name',$f)
    $xmlWriter.WriteElementString('SHA256',$HASH)
    $xmlWriter.WriteElementString('Size',$size)



    $xmlWriter.WriteEndElement()

}
 $xmlWriter.WriteEndElement()
# finalize the document:
$xmlWriter.WriteEndDocument()
$xmlWriter.Flush()

$xmlWriter.Close()

Мой ожидаемый XML файл похож на этот

<?xml version="1.0"?>
<!--System Information-->
<Lists>
    <Data Details>
        <Name>111-B01-A1.sfu</Name>
        <SHA256>4afdfefearfarafaa</SHA256>
        <Size>10234</Size>
    </Data Details>
    <Data Details>
        <Name>111-B21-A1.sfu</Name>
        <SHA256>4afdfefeardsgafaa</SHA256>
        <Size>10234</Size>
    </Data Details>
</Lists

Любой может помочь, пожалуйста спасибо

1 Ответ

2 голосов
/ 15 апреля 2020

Было довольно много ошибок с вашим кодом. Например, вам нужно создать System.Xml.XmlWriterSettings для подготовки красивого форматирования и не использовать свойства только для чтения или несуществующие свойства $XmlWriter объекта.

$Path должен быть абсолютным, а не Относительно, а также, имя элемента в XML не может содержать пробелы, поэтому Data Details не будет работать.

В любом случае, ваш код исправлен:

$Files = Get-ChildItem -Path .\*B01-A1* -Filter *.sfu -File
$Path  = "D:\SUM.xml"  # Use an Absolute path here !!

# choose a pretty formatting:
$XmlSettings = [System.Xml.XmlWriterSettings]::new()
$XmlSettings.Indent = $true
$XmlSettings.IndentChars = "`t"
# create the XmlWriter object using the output path and settings
$XmlWriter = [System.XML.XmlWriter]::Create($Path, $XmlSettings)

# write the header and XML Declaration
$xmlWriter.WriteStartDocument()
$xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='style.xsl'")
$XmlWriter.WriteComment('System Information')

# create root element
$xmlWriter.WriteStartElement('Lists') 
    # loop thrugh the files
    foreach ($f in $Files) {
        $Hash = (Get-FileHash -Path $f.FullName -Algorithm SHA256).Hash
        # add a 'File' element for each file
        $XmlWriter.WriteStartElement('DataDetails')   # an elementname cannot contain spaces
            # add three pieces of information:
            $xmlWriter.WriteElementString('Name',$f.Name)
            $xmlWriter.WriteElementString('SHA256',$Hash)
            $xmlWriter.WriteElementString('Size',$f.Length)
        # close the 'File' element
        $xmlWriter.WriteEndElement()
    }
# close the root element
$xmlWriter.WriteEndElement()
# finalize the document:
$xmlWriter.WriteEndDocument()
$xmlWriter.Flush()
$xmlWriter.Close()

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...