Войти

Показать полную графическую версию : [решено] Переименование XML по содержанию файла.


Tpyna4ek
15-08-2017, 11:51
подскажите как переименовать папку xml файлов по определенному xpath.

Cls

$OriginalLocation = "C:\xml\"

$AddressXPath = "/Extract/ReestrExtract/ExtractObjectRight/ExtractObject/ObjectDesc/Address/Content"

if (Test-Path($OriginalLocation))
{


Select-Xml -Path (Get-ChildItem -Recurse -Path $OriginalLocation -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

}

}

выдает ошибку:

Rename-Item : Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
строка:8 знак:12
+ Rename-Item <<<< -Path $OriginalFullname -NewName $NewFilename -Verbose
+ CategoryInfo : WriteError: (C:\xml\1 - копия.xml:String) [Rename-Item], IOException
+ FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

тут на форуме гдето нашел что надо применить Dispose(), но я не знаю как его применить правильно.

Kazun
15-08-2017, 12:09
Скачать handle (https://docs.microsoft.com/en-us/sysinternals/downloads/handle) - https://docs.microsoft.com/en-us/sysinternals/downloads/handle и посмотреть, какой процесс держит файл.

PS > & 'D:\handle.exe' -nobanner "C:\xml\1 - копия.xml"
powershell.exe pid: 13120 type: File E40: C:\xml\1 - копия.xml

Tpyna4ek
15-08-2017, 12:59
если перед переименованием вставить строчку & 'D:\handle.exe' -nobanner "C:\xml\1.xml" то

powershell.exe pid: 5636 type: File 3B8: C:\xml\1.xml
ПОДРОБНО: Выполнение операции "Переименование файла" над целевым объектом "Элемент: C:\xml\1.xml Назначение:
C:\xml\ул Чайковского, д 15, кв 67.xml".
Rename-Item : Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
строка:8 знак:12
+ Rename-Item <<<< -Path $OriginalFullname -NewName $NewFilename -Verbose
+ CategoryInfo : WriteError: (C:\xml\1.xml:String) [Rename-Item], IOException
+ FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand


если сразу после запустить. то

PS & 'D:\handle.exe' -nobanner "C:\xml\1.xml"
No matching handles found.

Kazun
15-08-2017, 13:20
$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 -Verbose
}
}

Tpyna4ek
15-08-2017, 13:26
спасибо большое. подскажите еще как сделать чтоб расширение xml добавлял. а то сейчас просто адресс без расширения.

Kazun
15-08-2017, 13:29
Rename-Item -Path $i.Path -NewName "$($i.Address).xml" -Verbose

Tpyna4ek
18-01-2018, 09:48
а можно чтобы символы запрещенные в имени файлов заменялись на тире. а то они не переименовываются.

Kazun
18-01-2018, 09:59
$file = "$($i.Address).xml"
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() | Foreach {
$file = $file.Replace($_,"-")
}

Rename-Item -Path $i.Path -NewName $file -Verbose

Iska
18-01-2018, 10:07
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() »
Ух ты!

Tpyna4ek
19-01-2018, 12:52
$file = "$($i.Address).xml"
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() | Foreach {
$file = $file.Replace($_,"-")
}
Rename-Item -Path $i.Path -NewName $file -Verbose »
извините, но куда это подставлять, пробовал по разному. ошибки выдает. сейчас ваш код выглядит так:

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
}
}
все понял. куда, спасибо.




© OSzone.net 2001-2012