|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Переименовать файл по содержимому |
|
|
Любой язык - [решено] Переименовать файл по содержимому
|
Пользователь Сообщения: 86 |
Приветствую. Помогите, пожалуйста, я не спец.
Есть очень много файлов default.htm, каждый лежит в своей папке. Это html страницы, внутри у каждой из них есть тэг <title>Название страницы</title>. Как бы переименовать каждый файл default.htm в Название страницы.html ? Повторюсь, каждый в своей папке, так что пересечений не будет. И еще в названии страницы присутствует символ / (например русское / английское название) его надо на что-то заменить. И может быть еще какие-то запрещенные символы. |
|
Отправлено: 19:23, 18-01-2015 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать @echo off set "dir=D:\Test" for /f "delims=" %%i in ('"2>nul dir/a-d/b/s "%dir%\default.htm""') do ( pushd "%%~dpi" for /f "delims=" %%j in ('powershell "($x='*'+((gc 'default.htm')-match '<title>..*</title>')+'*'-split '<title>'-split '</title>'-replace '[*\\|:\"\"<>/?</]','_' )[1]"') do ( ren "%%i" "%%j.htm" ) popd ) exit/b 0 |
Отправлено: 21:40, 18-01-2015 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Georgio, уж проще целиком на PowerShell, нежели вызывать его N раз.
deniskx, в общем — полностью программно никак. Разве что у Вас удачно окажется исключительно ANSI/1251 (или иная, но одинаковая для всех страниц кодировка, а не какая-нибудь солянка из UTF-8, отданная в KOI-8 и помеченная iso-8859-1, например. Ну, и все entities в <TITLE> также надо преобразовывать в нормальные символы. |
Отправлено: 22:11, 18-01-2015 | #3 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Цитата:
![]() |
|
Отправлено: 22:27, 18-01-2015 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Georgio, ???
|
|
Отправлено: 22:38, 18-01-2015 | #5 |
Пользователь Сообщения: 86
|
Профиль | Отправить PM | Цитировать Georgio, некоторые файлы переименовались, некоторые нет. И кириллица запортилась. Можно PowerShell и vbs скрипты, я не против. Главное, чтобы получилось. Там еще во вложенных папках лежат txt и файлы без расширения, их бы не запортить.
Цитата Iska:
|
|
Отправлено: 22:48, 18-01-2015 | #6 |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать Цитата deniskx:
Не знаю, что там у Вас такое. Данный код у меня и с UTF-8 отработал, и кириллицу не "запортил". A прикрепить образец файла, который не переименовался, и образец файла, в котором "кириллица запортилась", запаковав оба в архив, -- не вариант? Может, кто-то и разберётся... |
|
Отправлено: 23:52, 18-01-2015 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Georgio:
Мой вариант для UTF-8: Add-Type -AssemblyName System.Web
$sSourceFolder = "E:\Песочница\0423\01"
if(Test-Path -Path $sSourceFolder -PathType Container) {
Get-ChildItem -Path $sSourceFolder -Include default.htm -Recurse |`
ForEach-Object -Process {
if(-not $_.PSIsContainer) {
Write-Host "$($_.DirectoryName)" -ForegroundColor DarkGreen
Write-Host "`t$($_.Name)" -ForegroundColor Green
$sContent = Get-Content -Path $_.FullName -Encoding UTF8
$oMatch = [System.Text.RegularExpressions.Regex]::Match($sContent, "(?i)<(TITLE)[^<>]*>(?<title>[^<>]+)</\1>")
if($oMatch.Success) {
$sNewName = ([System.Web.HttpUtility]::HtmlDecode($oMatch.Groups.Item("title").Value) -replace '[<>:"/\\|?*]+', "_") + $_.Extension
Write-Host "`t`t$sNewName" -ForegroundColor Cyan
Rename-Item -Path $_.FullName -NewName $sNewName
} else {
Write-Host "`tCan't determine TITLE tag." -ForegroundColor Red
}
}
}
} else {
Write-Host "Can't find source folder [$sSourceFolder]." -ForegroundColor Red
}
|
|
Отправлено: 02:16, 19-01-2015 | #8 |
Пользователь Сообщения: 86
|
Профиль | Отправить PM | Цитировать Цитата Georgio:
Я пересохранил в Win UTF-8 с BOM и ваш скрипт нормально отработал, кроме одного файла (но у меня очень маленькая выборка пока из 10 случайных файлов, так то их десятки тысяч). От имени остался только конец после точки. Вот с таким <title>«The Secret Circle. The Temptation.» / «Тайный круг. Искушение.» :: Notabenoid.Com</title> Наверное какие-то запрещенные символы остались. А до конвертации "Ошибка в синтаксисе команды" тоже проскакивало. Хорошо бы сначала переконвертить все default.htm из Unix UTF-8 без BOM (Force) > Win UTF-8 с BOM. Не подскажете скрипт? Или может как-то явно указать эту кодировку в батнике. Цитата Iska:
|
||
Последний раз редактировалось deniskx, 19-01-2015 в 17:49. Отправлено: 10:36, 19-01-2015 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата deniskx:
Цитата deniskx:
|
||
Отправлено: 11:01, 19-01-2015 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WSH/JS - Если файлы отличаются (по дате, по содержимому ...), то произвести замену | norest2005 | Скриптовые языки администрирования Windows | 2 | 28-01-2014 04:00 | |
CMD/BAT - [решено] Как копировать файл по определенному содержимому | Kotan | Скриптовые языки администрирования Windows | 3 | 11-07-2013 14:58 | |
CMD/BAT - [решено] Переименовать файл | Mikhail_R | Скриптовые языки администрирования Windows | 8 | 21-03-2013 09:35 | |
CMD/BAT - Как найти в архиве тестовые файлы по содержимому, а не по расширению? | yaoleg2 | Скриптовые языки администрирования Windows | 0 | 04-01-2013 15:18 | |
Интерфейс - Как в Viste найти файл по содержимому | sagitt | Microsoft Windows Vista | 2 | 15-12-2008 10:40 |
|