Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование XML по содержанию файла. (http://forum.oszone.net/showthread.php?t=329093)

Tpyna4ek 15-08-2017 11:51 2758456

Переименование 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(), но я не знаю как его применить правильно.

Kazun 15-08-2017 12:09 2758470

Скачать handle - https://docs.microsoft.com/en-us/sys...wnloads/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 2758480

если перед переименованием вставить строчку & '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 2758493

Код:

$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 2758494

спасибо большое. подскажите еще как сделать чтоб расширение xml добавлял. а то сейчас просто адресс без расширения.

Kazun 15-08-2017 13:29 2758495

Код:

Rename-Item -Path $i.Path -NewName "$($i.Address).xml" -Verbose

Tpyna4ek 18-01-2018 09:48 2792231

а можно чтобы символы запрещенные в имени файлов заменялись на тире. а то они не переименовываются.

Kazun 18-01-2018 09:59 2792236

Код:

$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 2792239

Цитата:

Цитата Kazun
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() »

Ух ты!

Tpyna4ek 19-01-2018 12:52 2792483

Цитата:

Цитата 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.

Время: 14:41.
© OSzone.net 2001-