Чтение нескольких файлов XML в одном месте, поиск строки в этих файлах и перемещение файлов в другое место на основе строки - PullRequest
0 голосов
/ 27 июня 2018

Я работаю над сценарием PowerShell.

Сценарий:

XML-файлы, сохраненные в c: \ Temp \

Я хотел бы найти строку в этих XML-файлах, и каждый XML-файл имеет эту строку <AccountNum>CU000043<AccountNum>

Пример XML-файла:

-<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
-<Header>
<MessageId>{240ECE0A-19DC-4C0B-9B32-DED89888A1A5}</MessageId>
<Action>http://tempuri.org/shipment/read</Action>
</Header>
-<Body>
-<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
-<shipment xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/WHSShipmentASN">
<DocPurpose>Original</DocPurpose>
<SenderId>abc</SenderId>
<ValidAsOfDateTime>2018-06-22T20:08:25Z</ValidAsOfDateTime>
<ValidTimeStateType>AsOf</ValidTimeStateType>
-<shipmentTable class="entity">
<_DocumentHash>73ad5ddc457625bc0673e9d598c848cc</_DocumentHash>
<AccountNum>CU00131</AccountNum>

Значение «AccountNum» будет время от времени меняться. Я хочу, чтобы любой файл со значением CU00145 или CU00142 или CU00144 или CU00143 или CU00070 должен быть перемещены в папку «c: \ temp \ specific». Другие XML-файлы, значения которых отличаются от указанных выше, должны быть перемещены в «c: \ temp \ others».

Пример моего кода:

$FileDirectory = "C:\Temp\lane\test";
$OutputPath  = "C:\Temp\lane\Specific";
$OutputPath2 = "C:\Temp\lane\Others";

Get-ChildItem $FileDirectory | ? { !$_.PSIsContainer } | ForEach-Object {

    $FilePath = $_.FullName
    $Header = Get-Content $FilePath  

    if ($Header | Select-String -Pattern 'CU00145, CU00142, CU00144, CU00143, CU00070') {
        Move-Item $FilePath $OutputPath
    }
    else {
        Move-Item $FilePath $OutputPath2
    }
}

Я работал над простым сценарием PowerShell, но этот довольно смущает меня. Любая помощь будет высоко ценится. Я извиняюсь, если информации недостаточно. Дайте мне знать, если вам нужна дополнительная информация.

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете использовать регулярное выражение, чтобы найти номер счета в вашем файле с:

$Content = Get-Content $FilePath -Raw
$Content -match '\<AccountNum\>(?<AccountNum>[^<]+)\</AccountNum\>'

А затем сравните этот аккаунт со списком с чем-то вроде:

$FileDirectory    = "C:\Temp\test";
$SpecificAccounts = 'CU00145', 'CU00142', 'CU00144', 'CU00143', 'CU00070'
$OutputPath       = "C:\Temp\Specific";
$OutputPath2      = "C:\Temp\Others";

Get-ChildItem $FileDirectory -File | ForEach-Object {
    $FilePath = $_.FullName
    $Content = Get-Content $FilePath -Raw

    if ($Content -match '\<AccountNum\>(?<AccountNum>[^<]+)\</AccountNum\>') {
        if ($Matches['AccountNum'] -in $SpecificAccounts) {
            Move-Item $FilePath $OutputPath
        }
        else {
            Move-Item $FilePath $OutputPath2
        }
    }
    else {
        Write-Warning "No account found in file $FilePath"
        Move-Item $FilePath $OutputPath2
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...