Как переименовать файлы в папке на основе определенного содержимого в каждом файле с помощью PowerShell? - PullRequest
2 голосов
/ 08 мая 2019

Мне нужно скопировать заархивированные файлы приложения (все они в формате XML), а затем переименовать файлы с помощью идентификатора клиента и номера заказа на поставку.Чтобы найти эти значения, мне нужно было разделить данные по тегам элемента, чтобы найти значение индекса, а затем получить нужные мне значения на основе каждого индекса.Несколько дней назад, когда я закончил код, он работал как ожидалось.На следующий день попытался запустить его снова, и он переименовал все файлы с одинаковыми именами.Когда я проверил код (добавив «Что-если» или «Write-Host»), я вижу уникальные имена файлов.Я пытался заставить его работать снова, но безрезультатно.У меня есть образцы XML-документов, если необходимо.

Вот код (который когда-то работал):

        ForEach ($f in Get-ChildItem -path "C:\Archive\XML_Processed\Inbound\945-WHS_ShipAdvice_SW\" -Filter IB_945*.xml | Sort-Object) 
        {
            $indxPatt1 = '<e03_0373>'      ##Split Attribute/Element Tag in XML
            $indx1 = (Get-Content $f.fullname) | Select-String -Pattern $indxPatt1 |  ForEach-Object {$_.LineNumber} | Select-Object
            $var1A = (Get-Content $f.fullname) | Select -Index $indx1 
            $patt1A = '<e04_0145>'
            $patt2A = '</e04_0145>'
            $var2A = (Get-Content $f.fullname) | Select-String -Pattern $var1A  | Foreach-Object {$_  -replace $patt1A, ""} 
            $var2B = $var2A  | Foreach-Object {$_  -replace $patt2A, ""} 
            $var3C1 = $var2B | Foreach-Object {$_  -replace " {1,30}", ""}
            $var4A = $var3C1 | Foreach-Object {$_  -replace "^", "OrdNo_"}
            $varTP1B = (Get-Content $f.fullname) | Select -Index 5
            $pattTP1B = '<TradingPartner>'
            $pattTP2B = '</TradingPartner>'
            $varTP2B = (Get-Content $f.fullname) | Select-String -Pattern $varTP1B | Foreach-Object {$_  -replace $pattTP1B, ""} 
            $varTP3B = $varTP2B | Foreach-Object {$_  -replace $pattTP2B, ""}
            $var3TPD1 = $varTP3B | Foreach-Object {$_  -replace " {1,30}", ""}
            $varTP3D2 = $var3TPD1 | Foreach-Object {$_  -replace "^", "CustID_"}
            $varNewName = $varTP3D2 + "_" + $var4A  ##| Write-Host}
            Get-ChildItem C:\Archive\XML_Processed\Inbound\945-WHS_ShipAdvice_SW -Filter *.xml | rename-item -newname { $_.Name -replace 'IB_945', $varNewName};   ##-WhatIf;
        }

1 Ответ

0 голосов
/ 08 мая 2019

Если я понимаю, что вы пытаетесь сделать правильно (что сложно без входных данных), тогда (вероятно) ваша последняя строка должна быть изменена на:

$f | Rename-Item -Newname { $f.Name -replace 'IB_945', $varNewName} -WhatIf
...