Генерация настроек принтера в формате XML

Я пишу сценарий, который берет имя принтера из файла csv, и для каждого принтера предполагается изменить настройки принтера xml, изменить имя принтера, создать новый guid и вывести новый файл xml. Это почти работает. Проблема в том, что скрипт также изменяет clsid, потому что он имеет то же регулярное выражение, что и uid. Предполагается, что изменится только uid, другими словами: только второе вхождение соответствующего регулярного выражения.

Вот как выглядит файл xml:

<SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="cop-fibu-eink" status="cop-fibu-eink" image="1" changed="2021-02-18 14:52:29" uid="{7D783062-5840-4CBD-BE9A-6334FD87A8D6}" removePolicy="1" userContext="1" bypassErrors="1"><Properties action="R" comment="" path="\\srv-print01\cop-fibu-eink" location="" default="1" skipLocal="0" deleteAll="0" persistent="0" deleteMaps="0" port=""/><Filters><FilterGroup bool="AND" not="0" name="EKBDOM1\cop-fibu-eink" sid="S-1-5-21-356607561-1380008178-1848903544-16152" userContext="0" primaryGroup="0" localGroup="0"/></Filters></SharedPrinter>

А это скрипт Powershell:

Import-Csv .\printer_groups.csv | ForEach-Object { 
    $uid = ([guid]::NewGuid()).guid
    ((Get-Content -path C:\pc_inst\druckerliste\cop-it.xml -Raw) -replace "cop-fibu-eink", $($_.name)` -replace "\{[0-9a-z\-]*\}", $uid ) | Set-Content -Path .\xmls\$($_.name).xml 
}

Я не могу понять это. Надеюсь, вы, ребята, можете мне помочь. (:


person readyrockc    schedule 25.02.2021    source источник
comment
Используйте Export-Clixml вместо Set-Content   -  person PowerCat    schedule 25.02.2021


Ответы (3)


Мой коллега разобрался. Если кому интересно:

Import-Csv C:\pc_inst\druckerliste\printer_groups.csv | ForEach-Object { 
    $uid = ([guid]::NewGuid()).guid
    ((Get-Content -path C:\pc_inst\druckerliste\cop-it.xml -Raw) -replace "cop-fibu-eink", $($_.name)` -replace 'uid="\{[0-9a-z\-]*\}"', ('uid="{' + $uid + '}"') ) | Set-Content -Path C:\pc_inst\druckerliste\drucker_xml_standard\$($_.name).xml 
}
person readyrockc    schedule 25.02.2021
comment
Отметьте свой пост как ответ, чтобы помочь другим людям, которые ищут такое же решение :) - person PowerCat; 25.02.2021
comment
Вы не должны использовать Regex -replace в файле XML. PowerShell очень хорошо умеет манипулировать XML - person Theo; 25.02.2021

Если содержимое вашего файла в формате xml, почему бы не рассматривать его как xml, а не как обычный текст?

$oldText = @"
<SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" name="cop-fibu-eink" status="cop-fibu-eink" image="1" changed="2021-02-18 14:52:29" uid="{7D783062-5840-4CBD-BE9A-6334FD87A8D6}" removePolicy="1" userContext="1" bypassErrors="1">
  <Properties action="R" comment="" path="\\srv-print01\cop-fibu-eink" location="" default="1" skipLocal="0" deleteAll="0" persistent="0" deleteMaps="0" port="" />
  <Filters>
    <FilterGroup bool="AND" not="0" name="EKBDOM1\cop-fibu-eink" sid="S-1-5-21-356607561-1380008178-1848903544-16152" userContext="0" primaryGroup="0" localGroup="0" />
  </Filters>
</SharedPrinter>
"@

$xml = [xml] $oldText;

а затем вы можете легко изменить значения атрибутов следующим образом:

$xml.SharedPrinter.uid = "{" + [Guid]::NewGuid().ToString().ToUpperInvariant() + "};

и сериализовать его обратно в xml:

$newText = $xml.OuterXml;

write-host $newText;

Примечание. Возможно, это не имеет значения, но ваш исходный атрибут uid имеет закрывающие фигурные скобки и буквы верхнего регистра (uid="{7D783062-5840-4CBD-BE9A-6334FD87A8D6}"), поэтому я сопоставил это в новом значении...

person mclayton    schedule 25.02.2021

Я использовал что-то вроде этого. Он не очень хорошо структурирован, но просто работает. Он делает все, что связано с GPP, а не с вашей проблемой, но вы можете понять общую идею.

# Configuration variables
$PrintServer = ""
$CSVFilePath = "printers.csv"
$XMLFilePath = "printers.xml"


# The code

Import-Module ActiveDirectory
$Domain = (Get-ADDomain).name

$ScriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$Now = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

# Set The Formatting
$XMLSettings = New-Object System.Xml.XmlWriterSettings
$XMLSettings.Indent = $true
$XMLSettings.IndentChars = "    "

# Set the File Name Create The Document
$XMLWriter = [System.XML.XmlWriter]::Create($XMLfilePath, $XMLSettings)

# Write the XML Declaration
$XMLWriter.WriteStartDocument()

# Start the Root Element
$XMLWriter.WriteComment('Root of the policy')
$XMLWriter.WriteStartElement('Printers') # Start root
$XMLWriter.WriteAttributeString('clsid', '{1F577D12-3D1B-471e-A1B7-060317597B9C}')


Import-Csv (Join-Path -Path $ScriptPath -ChildPath $CSVFilePath) | ForEach-Object {
    $GroupName = $_.Group
    [Microsoft.ActiveDirectory.Management.ADGroup]$Group = Get-ADGroup -Filter { name -like $_.GroupName }

    # Start SharedPrinter Element
    $XMLWriter.WriteStartElement('SharedPrinter') # Start SharedPrinter
    $XMLWriter.WriteAttributeString('clsid', '{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}')
    $XMLWriter.WriteAttributeString('name', $_.Printer)
    $XMLWriter.WriteAttributeString('status', $_.Printer)
    $XMLWriter.WriteAttributeString('image', '1')
    $XMLWriter.WriteAttributeString('bypassErrors', '1')
    $XMLWriter.WriteAttributeString('changed', $Now)
    $XMLWriter.WriteAttributeString('uid', [System.Guid]::NewGuid().ToString())

        # Start Properties Element
        $XMLWriter.WriteStartElement('Properties') # Start Properties
        $XMLWriter.WriteAttributeString('action', 'R')
        $XMLWriter.WriteAttributeString('comment', '')
        $XMLWriter.WriteAttributeString('path', "\\$PrintServer\$($_.Printer)")
        $XMLWriter.WriteAttributeString('location', '')
        $XMLWriter.WriteAttributeString('default', $_.Default)
        $XMLWriter.WriteAttributeString('skipLocal', '0')
        $XMLWriter.WriteAttributeString('deleteAll', '0')
        $XMLWriter.WriteAttributeString('persistent', '0')
        $XMLWriter.WriteAttributeString('deleteMaps', '0')
        $XMLWriter.WriteAttributeString('port', '')
        $XMLWriter.WriteEndElement() # End Properties   

        # Start Filters Element
        $XMLWriter.WriteStartElement('Filters') # Start Filters

            # Start FilterGroup Element
            $XMLWriter.WriteStartElement('FilterGroup')
            $XMLWriter.WriteAttributeString('bool', 'AND')
            $XMLWriter.WriteAttributeString('not', '0')
            $XMLWriter.WriteAttributeString('name', "$Domain\$($Group.Name)")
            $XMLWriter.WriteAttributeString('sid', $Group.SID)
            $XMLWriter.WriteAttributeString('userContext', '1')
            $XMLWriter.WriteAttributeString('primaryGroup', '0')
            $XMLWriter.WriteAttributeString('localGroup', '0')
            $XMLWriter.WriteEndElement() # End FilterGroup

        $XMLWriter.WriteEndElement() # End Filters

    $XMLWriter.WriteEndElement() # End SharedPrinter
}

$XMLWriter.WriteEndElement() # End root

# End, Finalize and close the XML Document
$XMLWriter.WriteEndDocument()
$XMLWriter.Flush()
$XMLWriter.Close()
person Zafer Balkan    schedule 25.02.2021