Tpyna4ek #1 Опубликовано: 10 августа 2017 Народ может кто что подскажет. не могу никак найти решение. есть 2,5к xml файлов с одинаковой структурой. с рандомными названиями. в каждом файле есть адрес(улица дом квартира) уникальный. как можно их все переименовать в адрес? p.s. есть эти же файлы но в пдфе(может кто знает решение с пдфом.) Цитата Поделиться сообщением Ссылка на сообщение
KotZhilkina #2 10 августа 2017 Используй PowerShell. 1. в цикле открываешь файлы 2. открываешь файл и с помощью xpath вытягиваешь адрес из xml 3. сохраняешь файл с новым именем на основе полученного на шаге 2 адреса Цитата Публикация отключена Поделиться сообщением Ссылка на сообщение
KotZhilkina #3 10 августа 2017 (изменено) Cls $OriginalLocation = "C:\Projects\rename_xml\xml\" $AddressXPath = "/a/Address/text()" if (Test-Path($FileLocation)) { Select-Xml -Path (Get-ChildItem -Recurse -Path $FileLocation -Include @("*.xml") | where {! $_.PSIsContainer}) -Xpath $AddressXPath | ForEach-Object -Process { $Address = $_.Node.InnerText.ToString() $OriginalFullname = $_.Path $NewFilename = $Address + ".xml" Rename-Item -Path $OriginalFullname -NewName $NewFilename -Verbose -WhatIf } } В $OriginalLocation пропиши папку с файламиВ $AddressXPath пропиши XPath к ноде с адресом Если адрес находится в аттрибуте ($AddressXPath = "/a/Address/@Value"), то поменяй $Address = $_.Node.InnerText.ToString() на $Address = $_.Node.ToString() Если в адресах есть какие-то неподдерживаемые символы, то будут проблемы при переименовании (-WhatIf сообщит о возможных проблемах): What-If сообщаетRename-Item : Cannot rename the specified target, because it represents a path or device name.At line:15 char:5+ Rename-Item -Path $OriginalFullname -NewName $NewFilename -Verbose -WhatIf+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Rename-Item], PSArgumentException + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RenameItemCommand Если в адресах есть совпадения, то будут проблемы при переименовании (-WhatIf НЕ сообщит о возможных проблемах): What-If НЕ сообщаетRename-Item : Cannot create a file when that file already exists.At line:15 char:5+ Rename-Item -Path $OriginalFullname -NewName $NewFilename -Verbose+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Projects\ren...\MyAddress2.xml:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand -WhatIf убери только когда будешь готов к переименованию и лучше сначала потренируйся на копии файлов. Изменено 10 августа 2017 пользователем KotZhilkina Tpyna4ek понравилось это Цитата Публикация отключена Поделиться сообщением Ссылка на сообщение
Tpyna4ek #4 10 августа 2017 (изменено) Cls $OriginalLocation = "C:\Projects\rename_xml\xml\" $AddressXPath = "/a/Address/text()" if (Test-Path($FileLocation)) { Select-Xml -Path (Get-ChildItem -Recurse -Path $FileLocation -Include @("*.xml") | where {! $_.PSIsContainer}) -Xpath $AddressXPath | ForEach-Object -Process { $Address = $_.Node.InnerText.ToString() $OriginalFullname = $_.Path $NewFilename = $Address + ".xml" Rename-Item -Path $OriginalFullname -NewName $NewFilename -Verbose -WhatIf } } В $OriginalLocation пропиши папку с файламиВ $AddressXPath пропиши XPath к ноде с адресом Если адрес находится в аттрибуте ($AddressXPath = "/a/Address/@Value"), то поменяй $Address = $_.Node.InnerText.ToString() на $Address = $_.Node.ToString() Если в адресах есть какие-то неподдерживаемые символы, то будут проблемы при переименовании (-WhatIf сообщит о возможных проблемах): What-If сообщаетRename-Item : Cannot rename the specified target, because it represents a path or device name.At line:15 char:5+ Rename-Item -Path $OriginalFullname -NewName $NewFilename -Verbose -WhatIf+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Rename-Item], PSArgumentException + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RenameItemCommand Если в адресах есть совпадения, то будут проблемы при переименовании (-WhatIf НЕ сообщит о возможных проблемах): What-If НЕ сообщаетRename-Item : Cannot create a file when that file already exists.At line:15 char:5+ Rename-Item -Path $OriginalFullname -NewName $NewFilename -Verbose+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (C:\Projects\ren...\MyAddress2.xml:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand -WhatIf убери только когда будешь готов к переименованию и лучше сначала потренируйся на копии файлов. спасибо щас попробую разобраться.я какойто плагин для тотал коммандера пытался переделать. anyXML вроде. там тоже надо было Xpath поменять. менял на свой и чето всеравно не получалось. как правильно xpath узнать?если xml файлик скину сможешь сказать? Изменено 10 августа 2017 пользователем Tpyna4ek Цитата Поделиться сообщением Ссылка на сообщение
KotZhilkina #5 10 августа 2017 https://www.freeformatter.com/xpath-tester.html#xpath-examples Цитата Публикация отключена Поделиться сообщением Ссылка на сообщение
Tpyna4ek #6 10 августа 2017 https://www.freeformatter.com/xpath-tester.html#xpath-examplesчет не хочет.firebug говорит что $AddressXPath = "/Extract/ReestrExtract/ExtractObjectRight/ExtractObject/ObjectDesc/Address/Content"но при запуске с любым xpath мне пишет Test-Path : Не удается привязать аргумента к параметру "Path", так как он имеет значение NULL. строка:1 знак:14 + if (Test-Path <<<< ($FileLocation)) + CategoryInfo : InvalidData: (:) [Test-Path], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.TestPathCom mand Цитата Поделиться сообщением Ссылка на сообщение
KotZhilkina #7 11 августа 2017 -Path $FileLocation>-Path $OriginalLocation Tpyna4ek понравилось это Цитата Публикация отключена Поделиться сообщением Ссылка на сообщение
Tpyna4ek #8 11 августа 2017 (изменено) -Path $FileLocation>-Path $OriginalLocationсейчас пишет то правильно. но не переименовывает: ПОДРОБНО: Выполнение операции "Переименование файла" над целевым объектом "Элемент: C:\xml\obj_0df7fccd-ea3e-4c4c-80d7-63e0f03ea4bf.xml Назначение: C:\xml\ул Чайковского, д 15, кв 67.xml". Rename-Item : Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. строка:7 знак:12 + Rename-Item <<<< -Path $OriginalFullname -NewName $NewFilename -Verbose + CategoryInfo : WriteError: (C:\xml\obj_0df7...3e0f03ea4bf.xml:String) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand Изменено 16 августа 2017 пользователем Tpyna4ek Цитата Поделиться сообщением Ссылка на сообщение
KotZhilkina #9 11 августа 2017 Процесс не может получить доступ к файлу, так как этот файл занят другим процессом. Tpyna4ek понравилось это Цитата Публикация отключена Поделиться сообщением Ссылка на сообщение
Tpyna4ek #10 11 августа 2017 (изменено) Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.Я это понял но файл закрыт и ничем не используется.В интернетах нашел что перед переименованием надо поставить $file.Dispose() но мне это не помогло. В общем вот рабочий вариант, вдруг кому пригодится: cls $OriginalLocation = "C:\xml\" $AddressXPath = "/Extract/ReestrExtract/ExtractObjectRight/ExtractObject/ObjectDesc/Address/Content" if (Test-Path $OriginalLocation) { $obj = Select-Xml -Path (Get-ChildItem -Recurse -Path $OriginalLocation -Include @("*.xml") | where {! $_.PSIsContainer}) -Xpath $AddressXPath | Select Path,@{n="Address";e={$_.Node.InnerText.ToString()}} foreach($i in $obj) { Rename-Item -Path $i.Path -NewName "$($i.Address).xml" -Verbose } } Изменено 16 августа 2017 пользователем Tpyna4ek Цитата Поделиться сообщением Ссылка на сообщение