 |
|
Переименование XML по содержанию файла.
подскажите как переименовать папку 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(), но я не знаю как его применить правильно.
|
если перед переименованием вставить строчку & '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
}
}
|
спасибо большое. подскажите еще как сделать чтоб расширение xml добавлял. а то сейчас просто адресс без расширения.
|
Код:
Rename-Item -Path $i.Path -NewName "$($i.Address).xml" -Verbose
|
а можно чтобы символы запрещенные в имени файлов заменялись на тире. а то они не переименовываются.
|
Код:
$file = "$($i.Address).xml"
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() | Foreach {
$file = $file.Replace($_,"-")
}
Rename-Item -Path $i.Path -NewName $file -Verbose
|
Цитата:
Цитата Kazun
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() »
|
Ух ты!
|
Цитата:
Цитата Kazun
$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
}
}
все понял. куда, спасибо.
|
Время: 14:41.
© OSzone.net 2001-