Переименовать файлы 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]
Как это реализовать, подскажите?
|
Код:
dir *.xml | ren -new {
$kpt = ([xml](Get-Content $_.FullName)).KPT
"{0}_{1}.xml" -f $kpt.CadastralBlocks.CadastralBlock.CadastralNumber.split(":")[-1],$kpt.CertificationDoc.Date
}
|
не совсем то на что я надеялся. Думал по аналогии смогу сделать для других типов XML. а в этом коде я вообще не понимаю)))
|
Так и делайте по аналогии для других.
Цитата:
Цитата al-1k
а в этом коде я вообще не понимаю))) »
|
Получили командлетом Get-ChildItem набор файлов xml в текущем каталоге и передали его по конвейеру командлету Rename-Item. В качестве нового имени используется результат блока кода, в котором сначала читается содержимое очередного файла из набора, делается попытка преобразования полученного содержимого к типу System.Xml.XmlDocument и присвоение узла .KPT переменной. Затем по полученной переменной KPT, спускаясь по указанной Вами иерархии, получаем узел CadastralNumber, разбиваем его на части по символу ":" в массив, берём последний элемент полученного массива. Из той же переменной получаем узел Date. Оба полученных объекта форматируем в виде потребного имени файла.
|
Цитата:
Цитата Iska
получаем узел CadastralNumber, разбиваем его на части по символу ":" в массив, берём последний элемент полученного массива »
|
в этом и суть! необходимо для других типов xml, в которых CadastralNumber выглядит типа "00:00:0000000:123" необходимо переименовать по типу "0000000-123_2016-01-01"
|
Код:
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]
|
al-1k, как я понимаю, Вам для начала надо самому определиться, как вообще может выглядеть CadastralNumber, каким правилам подчиняется его содержимое. Затем, основываясь на этих правилах, описать алгоритм образования имени файла из CadastralNumber. Полный алгоритм. Инако мы можем долго ходить по кругу, раз за разом выясняя всё новые нюансы.
|
Круть!!! Шик!!! Блеск и красота!!! Осталось прикрутить что-нибудь, чтобы при дублирующихся файлах дописывалось "0000000-123_2016-01-01(2)" или вовсе удалялся дубль. Возможно?
Цитата:
Цитата Iska
мы можем долго ходить по кругу, раз за разом выясняя всё новые нюансы »
|
В идеале было бы прикрутить код к этому коду http://dumpz.org/1278098/ если из него что-нибудь ясно
|
Цитата:
Цитата al-1k
чтобы при дублирующихся файлах дописывалось "0000000-123_2016-01-01(2)" или вовсе удалялся дубль. »
|
Повторяю: определитесь.
|
Вау. Удивлен увидеть свой код.
al-1k, Опишите подробно цели и задачи своего скрипта. Мой по прежнему работает, уже с ЕГРН.
Последняя версия моего монстра
http://dumpz.org/2536094/
|
Цитата:
Цитата 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++
}
}
|
Вообще наверное круть))) Только непонятно что он делает. Предыдущий код я использовал для сортировки файлов
Цитата:
Цитата Iska
чтобы при дублирующихся файлах дописывалось "0000000-123_2016-01-01(2)" или вовсе удалялся дубль. »
Повторяю: определитесь. »
|
В идеале было бы чтоб вовсе удалялся
|
Время: 12:47.
© OSzone.net 2001-