Как получить запись данных из каталога, содержащего файлы xml, и поместить их в массив в powershell? - PullRequest
0 голосов
/ 28 февраля 2020

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

Я очень новичок в powershell и мне не повезло с разбором XML файлов. Вот мой текущий код:

### Global Variables

$Global:server = "SERVER"
$Global:archive = "\\$server\PCMS\Archive"
$Global:xmlDir = "\\$server\PCMS\Archive\xml"
$Global:date = Get-Date -Format yyyyMMdd
$Global:dateFolder = "$archive\$date"
$Global:manifest = "\\$server\PCMS\Temp"


### Functions


# Create a folder with today's date
function new-folder
{
    New-Item -ItemType Directory -Path $Global:archive -Name $Global:date
}

# Analyze files and get store number
function files2dir 
{
    $Global:array = @((Get-ChildItem -Path $xmlDir -Recurse -Include 0*.xml -Name -ErrorAction Stop))
    $Global:array = $array.SubString(0,4) | Get-Unique #gets first 4 characters of a file and only keeps unique items
}


If (Test-Path -Path $dateFolder) {
    Main
}
else {
    new-folder
}

## Main script
function Main {

files2dir
$integer = 0

foreach($file in $array){
    New-Item -ItemType Directory -Path $dateFolder -Name $array[$integer] -erroraction 'silentlycontinue'
    $integer = $integer + 1
}

}

А вот пример файлов xml в каталоге. Я пытаюсь получить значение storeCode

<?xml version="1.0" encoding="UTF-8"?>

<beanstoreTransaction>
<transactionSession>
<Session class="redacted" action="0">
<version>
  <database>Redacted</database>
  <build>Redacted</build>
</version>
  <companyCode>XXXX</companyCode>
  <frequency>YYYYY</frequency>
  <openMethod>2</openMethod>
  <sessionID>ZZZ</sessionID>
  <startDateTime>2020-02-24 05:12:47.00</startDateTime>
  <statusStatusCode>Q</statusStatusCode>
  <storeCode>1111</storeCode>
  <tillTillNumber>9</tillTillNumber>
  <tradingDate>2020-02-24</tradingDate>
  <transactionNumber>RRRR</transactionNumber>
</Session>
</beanstoreTransaction>

1 Ответ

0 голосов
/ 28 февраля 2020

PowerShell в значительной степени основан на XML и имеет встроенные командлеты для работы с правильно отформатированными XML файлами ...

Get-Command -Name '*xml*'
<#
# Results

CommandType     Name                Version    Source  
-----------     ----                -------    ------  
...                      
Cmdlet          ConvertTo-Xml       3.1.0.0    Microsoft.PowerShell.Utility           
...                     
Cmdlet          Export-Clixml       3.1.0.0    Microsoft.PowerShell.Utility           
Cmdlet          Import-Clixml       3.1.0.0    Microsoft.PowerShell.Utility           
Cmdlet          Merge-XMLFile       5.0.0.1    Sorlov.PowerShell                      
...                     
Cmdlet          Select-Xml          3.1.0.0    Microsoft.PowerShell.Utility
#> 

... таким образом, используйте примеры из этих командлетов. Тем не менее, даже если это не так, он может использовать для этого пространство имен. Net.

[System.Xml]$XmlDocument = Get-Content -Path 'D:\temp\XmlData.xml'
$XmlDocument.

Просто найдите 'Анализ PowerShell XML'

Основы данных PowerShell: XML

Доступ к XML с помощью XPath После загрузки файла в объект XmlDocument вы можете перемещаться по дереву XML с помощью XPath. Чтобы выбрать набор узлов, используйте метод SelectNodes:

$xdoc = New-Object System.Xml.XmlDocument
$file = resolve-path('.\sample.xml')
$xdoc.load($file)

[xml] $xdoc = Get-Content '.\sample.xml'
$xdoc = [xml] (Get-Content '.\sample.xml')
$xdoc.SelectNodes('//author')

Powershell: синтаксический анализ XML Часть 1

Использование PowerShell для анализа XML файла и сортировки данных

Синтаксический анализ XML файлов с помощью PowerShell

PowerShell предлагает несколько способов чтения XML документов, без написания большого количества кода

Поскольку XML - это просто текст, вы также можете просто использовать командлет Get-Content с командлетом Select-String или RegEx для извлечения текста из любого текстового файла.

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