Замена символов в название папки Powershell

SAS2014
Дата: 08.12.2017 08:59:58
Подскажите код который будет искать в указанной папке под папки и если в их название есть % то заменить на _
SAS2014
Дата: 08.12.2017 09:05:35
или на C# код
Basil A. Sidorov
Дата: 08.12.2017 09:08:46
WebSharper
Дата: 08.12.2017 10:31:58
ls -recourse Папка  -include *%* -Directory | %{ Rename-Item $_.FullName ($_.Name -replace '%', '_') } 
SAS2014
Дата: 09.12.2017 06:54:34
Вот скрипт

cls
write-host "---------------------------------------------------"
write-host "Удаление % в имени подкаталогов в указаном каталоге"
write-host "---------------------------------------------------"
''
$catalog = Read-Host "Укажите каталог"
Get-ChildItem $catalog -Recurse -include *%* | %{ Rename-Item $_.FullName ($_.Name -replace '%', '') } # удалить % в имени каталога


В нем есть два не достатка

1. Он работает так:
видит подкаталог убирает в имени %, в этом же подкаталоге есть еще один каталог с % скрипт % не убирает, но странно в том, что если запускаю повторно скрипт % убирает в каталоге в котором с первого раза не убрал!

2. А так же он почему то % с имени файлов убирает, а этого не надо

3. Если в пути указном каталоге (
$catalog
) есть пробел то получаю ошибки, но скрипт отрабатывает см. пункты.1, 2

Может кто подскажет в чем дело? ключ -Recurse сюдя по инфе он должен сказать о том, чтобы смотрел на все подкаталоги, но не хочет.

Заранее спасибо
На вопросы смогу ответить только 13 декабря
SAS2014
Дата: 09.12.2017 06:55:29
Sorry, не два, а три не достатка ))
Basil A. Sidorov
Дата: 09.12.2017 07:27:41
Ну очевидно же, что после переименования каталога изменился (полный) путь ко всем вложенным подкаталогам. Если PS сначала делает рекурсивный обход и только потом начинает переименование, то получаем проблему.
В данном конкретном случае требуется обход в глубину: сначала проходим до конца один путь и только потом начинаем переименовывать "постепенно поднимаясь наверх". Только после этого идём по следующему пути.
WebSharper
Дата: 10.12.2017 18:30:58
2. ключ -Directory (см мой скрипт)


Разберитесь как работают параметры в powershell - (param())

Да, наверное надо в пайплайн вставит сортировку

ls .... | sort FullName -Descending | %{ Rename-Item ... }

Тогда более вложенные папки будут вначале
SAS2014
Дата: 14.12.2017 08:33:50
решил проверить работу скрипта в Powershell версии 3.0
$Path = Read-Host "Укажите каталог";
$catalogs = Get-ChildItem $Path -Recurse  | where {$_.PSIsContainer} | where-object  {$_.name -like '*%*'}
$catalogs | Rename-Item -NewName {$_.Name -Replace '%', ''} 


то такой код работает
так как надо т.е. убирает из имен подкаталогов % выбраного каталога
это если скрипт запустить в Powershell 3.0

А в Powershell 2.0 не работает

Тут написали, что нужно указать с начало. чтобы скрипт начал работу с конца и продолжал изменять имена подкаталогов двигаясь вверх по дереву каталога, но как это сделать я не знаю, может кто то подскажет????
SAS2014
Дата: 14.12.2017 08:35:06
SAS2014
решил проверить работу скрипта в Powershell версии 3.0
$Path = Read-Host "Укажите каталог";
$catalogs = Get-ChildItem $Path -Recurse  | where {$_.PSIsContainer} | where-object  {$_.name -like '*%*'}
$catalogs | Rename-Item -NewName {$_.Name -Replace '%', ''} 


то такой код работает
так как надо т.е. убирает из имен подкаталогов % выбраного каталога
это если скрипт запустить в Powershell 3.0

А в Powershell 2.0 не работает

Тут написали, что нужно указать с начало. чтобы скрипт начал работу с конца и продолжал изменять имена подкаталогов двигаясь вверх по дереву каталога, но как это сделать я не знаю, может кто то подскажет????


а не стоп по поводу Тут написали, что нужно указать с начало. чтобы скрипт начал работу с конца и продолжал изменять имена подкаталогов двигаясь вверх по дереву каталога, но как это сделать я не знаю, может кто то подскажет????[/quot]



отбой