Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Переименовать файлы XML (http://forum.oszone.net/showthread.php?t=324709)

al-1k 12-03-2017 14:12 2718741

Переименовать файлы XML
 
Суть вопроса такова:
Имеются куча файлов XML. Необходимо переименовать файлы по содержимому, типа "0000000_2016-01-01.xml".

Содержимое находится по таким путям:
$sDateCreateDoc = $oXmlDocument.KPT.CertificationDoc.Date
$sCadastralNumber = $oXmlDocument.KPT.CadastralBlocks.CadastralBlock
CadastralNumber - Выглядит типа 00:00:0000000
# разбить кадастровый номер на подстроки по ":"
$sCadastralNumberSplit = $sCadastralNumber -split ':'
# в итоге имеем следующие переменные:
$Cad_Region = $sCadastralNumberSplit[0]
$Cad_Rayion = $sCadastralNumberSplit[1]
$Cad_Kvartal = $sCadastralNumberSplit[2]
Как это реализовать, подскажите?

Kazun 12-03-2017 17:19 2718772

Код:

dir *.xml | ren -new {
        $kpt = ([xml](Get-Content $_.FullName)).KPT
        "{0}_{1}.xml" -f $kpt.CadastralBlocks.CadastralBlock.CadastralNumber.split(":")[-1],$kpt.CertificationDoc.Date
}


al-1k 13-03-2017 16:39 2719038

не совсем то на что я надеялся. Думал по аналогии смогу сделать для других типов XML. а в этом коде я вообще не понимаю)))

Iska 13-03-2017 18:02 2719066

Так и делайте по аналогии для других.

Цитата:

Цитата al-1k
а в этом коде я вообще не понимаю))) »

Получили командлетом Get-ChildItem набор файлов xml в текущем каталоге и передали его по конвейеру командлету Rename-Item. В качестве нового имени используется результат блока кода, в котором сначала читается содержимое очередного файла из набора, делается попытка преобразования полученного содержимого к типу System.Xml.XmlDocument и присвоение узла .KPT переменной. Затем по полученной переменной KPT, спускаясь по указанной Вами иерархии, получаем узел CadastralNumber, разбиваем его на части по символу ":" в массив, берём последний элемент полученного массива. Из той же переменной получаем узел Date. Оба полученных объекта форматируем в виде потребного имени файла.

al-1k 13-03-2017 19:07 2719079

Цитата:

Цитата Iska
получаем узел CadastralNumber, разбиваем его на части по символу ":" в массив, берём последний элемент полученного массива »

в этом и суть! необходимо для других типов xml, в которых CadastralNumber выглядит типа "00:00:0000000:123" необходимо переименовать по типу "0000000-123_2016-01-01"

Kazun 13-03-2017 19:18 2719082

Код:

PS > "00:00:0000000:123".replace(":","-").split("-",3)[-1]
0000000-123

PS > "00:00:0000000".replace(":","-").split("-",3)[-1]
0000000

$kpt.CadastralBlocks.CadastralBlock.CadastralNumber.replace(":","-").split("-",3)[-1]


Iska 13-03-2017 19:36 2719087

al-1k, как я понимаю, Вам для начала надо самому определиться, как вообще может выглядеть CadastralNumber, каким правилам подчиняется его содержимое. Затем, основываясь на этих правилах, описать алгоритм образования имени файла из CadastralNumber. Полный алгоритм. Инако мы можем долго ходить по кругу, раз за разом выясняя всё новые нюансы.

al-1k 13-03-2017 20:02 2719094

Круть!!! Шик!!! Блеск и красота!!! Осталось прикрутить что-нибудь, чтобы при дублирующихся файлах дописывалось "0000000-123_2016-01-01(2)" или вовсе удалялся дубль. Возможно?

Цитата:

Цитата Iska
мы можем долго ходить по кругу, раз за разом выясняя всё новые нюансы »

В идеале было бы прикрутить код к этому коду http://dumpz.org/1278098/ если из него что-нибудь ясно

Iska 14-03-2017 07:20 2719207

Цитата:

Цитата al-1k
чтобы при дублирующихся файлах дописывалось "0000000-123_2016-01-01(2)" или вовсе удалялся дубль. »

Повторяю: определитесь.

firstarey 13-04-2017 08:41 2728864

Цитата:

Цитата al-1k
В идеале было бы прикрутить код к этому коду http://dumpz.org/1278098/ если из него что-нибудь ясно »

Вау. Удивлен увидеть свой код.
al-1k, Опишите подробно цели и задачи своего скрипта. Мой по прежнему работает, уже с ЕГРН.

Последняя версия моего монстра
http://dumpz.org/2536094/

firstarey 13-04-2017 09:42 2728878

Цитата:

Цитата al-1k
Осталось прикрутить что-нибудь, чтобы при дублирующихся файлах дописывалось "0000000-123_2016-01-01(2)" или вовсе удалялся дубль. Возможно? »

у меня реализовано таким образом:

Код:

Write-Host "обратите внимание: такой файл уже имеется" -ForegroundColor Yellow
if (!(test-path "$PathOut\повторы")) {# создаем каталог если его нет
        new-item -path "$PathOut\повторы" -type directory -force | Out-Null
}
Remove-Variable Flag_ReName,NamePlus -ErrorAction SilentlyContinue
$NamePlus=1
$OutNamePovtor = $OutName.Substring(0,($OutName.Length -4)) # срезаем 4 символа с конца
While ($Flag_ReName -eq $null) { # пока флаг пустой проверяем существование файла и добавляем 1 к NamePlus
        if (!(test-path "$PathOut\повторы\$OutNamePovtor ($NamePlus)`.xml")) { # проверяем имеется ли файл в КОТОРЫЙ мы хотим переименовать
                $OutPath = "$PathOut\повторы\" # каталог назначения
                $OutName = "$OutNamePovtor ($NamePlus)`.xml" # формируем имя файла "что-то там-(номер)-разрешение"
                $Flag_ReName=$NamePlus
                move-item -path "$FileXmlCurrent" -destination "$OutPath\$OutName"
                if (test-path "$FileXmlCurrent`.sig") {# на случай присутсвия файла цифровой подписи
                        $OutName = "$OutNamePovtor ($NamePlus)`.xml`.sig"
                        move-item -path "$FileXmlCurrent`.sig" -destination "$OutPath\$OutName"
                }
        }
        else {
                $NamePlus++
        }
}


al-1k 15-05-2017 19:37 2736999

Цитата:

Цитата firstarey
Последняя версия моего монстра
http://dumpz.org/2536094/ »

Вообще наверное круть))) Только непонятно что он делает. Предыдущий код я использовал для сортировки файлов

Цитата:

Цитата Iska
чтобы при дублирующихся файлах дописывалось "0000000-123_2016-01-01(2)" или вовсе удалялся дубль. »
Повторяю: определитесь. »

В идеале было бы чтоб вовсе удалялся


Время: 12:47.

Время: 12:47.
© OSzone.net 2001-