Redenumire batch fisiere xml dintr-un folder dupa continut fisier

Configurare noua (How To)

Situatie

Firmele care sunt obligate acum sa lucreze cu sistemul electronic eFactura intampina o problema. Facturile emise catre firma respectiva trebuie descarcate din eFactura si pastrate in arhiva.

Problema  este data de faptul ca fiecare factura primita, si la multe firme sunt sute de facturi lunar, se pot descarca doar individual.Aceasta se rezolva insa cu ajutorul unui addon de descarcare care se poate instala cu usurinta in Chrome, si care ne va permite sa descarcam bulk toate fisierele tip XML o singura data.

O alta prolema este data de faptul ca acele fisiere XML nu au un  nume care sa aiba o indicatie vis-a-vis de numele firmei emitente si numarul facturii, lucru ce face ca identificarea ulterioara sa fie dificila.Pentru aceasta am dezvoltat un script Powershell, care redenumeste fisierele XML dintr-un folder prestabilit, dupa doua linii de cod din interiorul fiecarui XML, una contine numele firmei emitente si cealalta numarul facturii.

Aceste linii sunt:

camp numar si serie factura: “<cbc:ID>AB/117</cbc:ID>”

camp firma emitenta: “<cbc:RegistrationName>Orange Romania S.A.</cbc:RegistrationName>”

Scriptul 1 este un script powershell:

$folder = “cale folder de forma D:\xmlredenumire
Set-Location $folder

Get-ChildItem -Filter *.xml | ForEach-Object {
try {
[xml]$xml = Get-Content $_.FullName

$nsmgr = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$nsmgr.AddNamespace(‘cbc’, ‘urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2’)

$invoiceNode = $xml.SelectSingleNode(‘//cbc:ID’, $nsmgr)
$companyNode = $xml.SelectSingleNode(‘//cbc:RegistrationName’, $nsmgr)

if (-not $invoiceNode) { $invoiceNode = $xml.SelectSingleNode(‘//ID’) }
if (-not $companyNode) { $companyNode = $xml.SelectSingleNode(‘//RegistrationName’) }

if ($invoiceNode -and $companyNode) {
$invoice = $invoiceNode.InnerText -replace ‘[\\/:”*?<>|]’, ‘-‘
$company = $companyNode.InnerText -replace ‘[\\/:”*?<>|]’, ” -replace ‘\s+’, ‘_’

$newName = “$company-$invoice.xml”

if ($_.Name -ne $newName) {
Rename-Item $_.FullName -NewName $newName
Write-Host “Renamed ‘$($_.Name)’ to ‘$newName'”
} else {
Write-Host “File ‘$($_.Name)’ already named correctly.”
}
} else {
Write-Warning “Could not find invoice or company name in ‘$($_.Name)’. Skipped.”
}
} catch {
Write-Warning “Error processing ‘$($_.Name)’: $_”
}
}

In cazul in care apar fisiere xml cu nume diferite (am mentionat ca numele fisierului XML este unul generic de forma download01.xml, downloa02.xml, download27062025.xml), ceea ce inseamna ca o firma furnizoare a incarcat de doua ori aceeasi factura, scriptul nu modifica al doilea fisier xml, asa ca rezultatul final este lista corecta de xml.

separat, am conceput un script bat, care poate fi rulat prin  dublu click.

Continut fisier bat:

@echo off
powershell.exe -NoProfile -ExecutionPolicy Bypass -File “calea unde se afla fisierul cu scriptul poweshell – exemplu D:\xmlredenumire\rename_xmls.ps1
pause

La rularea scriptului BAT, tuturor fisierelor xml din folderul – exemplu D:\xmlredenumire, li se va schimba numele dupa model:

furnizor _ numar serie factura .xml

Solutie

Tip solutie

Permanent

Voteaza

(3 din 5 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?