Показать полную графическую версию : [решено] Переименование 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(), но я не знаю как его применить правильно.
Скачать 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.
$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 добавлял. а то сейчас просто адресс без расширения.
Rename-Item -Path $i.Path -NewName "$($i.Address).xml" -Verbose
Tpyna4ek
18-01-2018, 09:48
а можно чтобы символы запрещенные в имени файлов заменялись на тире. а то они не переименовываются.
$file = "$($i.Address).xml"
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() | Foreach {
$file = $file.Replace($_,"-")
}
Rename-Item -Path $i.Path -NewName $file -Verbose
[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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.