Перейти к публикации
  • Сейчас на странице   Всего пользователей: 0   (0 пользователей, 0 гостей)

Tpyna4ek

Пакетное переименование.

Рекомендованные сообщения

Народ может кто что подскажет. не могу никак найти решение. есть 2,5к xml файлов с одинаковой структурой. с рандомными названиями. в каждом файле есть адрес(улица дом квартира) уникальный. как можно их все переименовать в адрес?

 

p.s. есть эти же файлы но в пдфе(может кто знает решение с пдфом.)

Поделиться сообщением


Ссылка на сообщение

Используй PowerShell.

 

1. в цикле открываешь файлы

2. открываешь файл и с помощью xpath вытягиваешь адрес из xml

3. сохраняешь файл с новым именем на основе полученного на шаге 2 адреса


Публикация отключена

Поделиться сообщением


Ссылка на сообщение
(изменено)

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 убери только когда будешь готов к переименованию и лучше сначала потренируйся на копии файлов.


Изменено пользователем KotZhilkina
Tpyna4ek понравилось это

Публикация отключена

Поделиться сообщением


Ссылка на сообщение
(изменено)
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 файлик скину сможешь сказать?


Изменено пользователем Tpyna4ek

Поделиться сообщением


Ссылка на сообщение

чет не хочет.

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

Поделиться сообщением


Ссылка на сообщение
(изменено)

-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

Изменено пользователем Tpyna4ek

Поделиться сообщением


Ссылка на сообщение

Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

Tpyna4ek понравилось это

Публикация отключена

Поделиться сообщением


Ссылка на сообщение
(изменено)

Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

Я это понял но файл закрыт и ничем не используется.

В интернетах нашел что перед переименованием надо поставить $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
	}
} 

Изменено пользователем Tpyna4ek

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

×
×
  • Создать...