PowerShell - [решено] Переименование XML по содержанию файла.

Ответить
Аватара пользователя
Tpyna4ek

PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Tpyna4ek »

подскажите как переименовать папку 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 

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

Re: PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Kazun »

Скачать
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

Re: PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Tpyna4ek »

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

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



Код:

Код: Выделить всё

PS & 'D:\handle.exe' -nobanner "C:\xml\1.xml"
No matching handles found.
Аватара пользователя
Kazun

Re: PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Kazun »

Код:

Код: Выделить всё

$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

Re: PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Tpyna4ek »

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

Re: PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Tpyna4ek »

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

Re: PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Tpyna4ek »

Код:

Код: Выделить всё

$file = "$($i.Address).xml"
[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() | Foreach {
	$file = $file.Replace($_,"-")
}
Rename-Item -Path $i.Path -NewName $file -Verbose
Аватара пользователя
Iska

Re: PowerShell - [решено] Переименование XML по содержанию файла.

Сообщение Iska »

Цитата Kazun:



$file = "$($i.Address).xml"

[IO.Path]::GetInvalidFileNameChars() + [IO.Path]::GetInvalidPathChars() | Foreach {

$file = $file.Replace($_,"-")

}

Rename-Item -Path $i.Path -NewName $file -Verbose
PowerShell - [решено] Переименование XML по содержанию файла.




извините, но куда это подставлять, пробовал по разному. ошибки выдает. сейчас ваш код выглядит так:



Код:

Код: Выделить всё

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
	}
}

все понял. куда, спасибо.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»