Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Переименовать файл по содержимому

Ответить
Настройки темы
Любой язык - [решено] Переименовать файл по содержимому

Пользователь


Сообщения: 86
Благодарности: 15

Профиль | Отправить PM | Цитировать


Изменения
Автор: deniskx
Дата: 18-01-2015
Приветствую. Помогите, пожалуйста, я не спец.
Есть очень много файлов default.htm, каждый лежит в своей папке. Это html страницы, внутри у каждой из них есть тэг <title>Название страницы</title>. Как бы переименовать каждый файл default.htm в Название страницы.html ? Повторюсь, каждый в своей папке, так что пересечений не будет.

И еще в названии страницы присутствует символ / (например русское / английское название) его надо на что-то заменить. И может быть еще какие-то запрещенные символы.

Отправлено: 19:23, 18-01-2015

 

Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Georgio, уж проще целиком на PowerShell, нежели вызывать его N раз.

deniskx, в общем — полностью программно никак. Разве что у Вас удачно окажется исключительно ANSI/1251 (или иная, но одинаковая для всех страниц кодировка, а не какая-нибудь солянка из UTF-8, отданная в KOI-8 и помеченная iso-8859-1, например. Ну, и все entities в <TITLE> также надо преобразовывать в нормальные символы.

Отправлено: 22:11, 18-01-2015 | #3


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата:
<title>CMD/BAT - Переименовать файл по содержимому</title>

Отправлено: 22:27, 18-01-2015 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Georgio, ???

Отправлено: 22:38, 18-01-2015 | #5


Пользователь


Сообщения: 86
Благодарности: 15

Профиль | Отправить PM | Цитировать


Georgio, некоторые файлы переименовались, некоторые нет. И кириллица запортилась. Можно PowerShell и vbs скрипты, я не против. Главное, чтобы получилось. Там еще во вложенных папках лежат txt и файлы без расширения, их бы не запортить.
Цитата Iska:
одинаковая для всех страниц кодировка »
Все сохранено с одного сервера, так что кодировка одинаковая. Unix UTF-8 без BOM.

Отправлено: 22:48, 18-01-2015 | #6


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата deniskx:
некоторые файлы переименовались, некоторые нет. И кириллица запортилась »

Не знаю, что там у Вас такое. Данный код у меня и с UTF-8 отработал, и кириллицу не "запортил". A прикрепить образец файла, который не переименовался, и образец файла, в котором "кириллица запортилась", запаковав оба в архив, -- не вариант? Может, кто-то и разберётся...
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:52, 18-01-2015 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Georgio:
Данный код у меня и с UTF-8 отработал, и кириллицу не "запортил". »
У меня на PowerShell 2.0:
Код: Выделить весь код
Ошибка в синтаксисе команды.


Мой вариант для 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
Благодарности: 15

Профиль | Отправить PM | Цитировать


Цитата Georgio:
Данный код у меня и с UTF-8 отработал, и кириллицу не "запортил" »
Все дело в том, что это UTF-8 без BOM и даже Akelpad иногда путает и открывает как 1251, в результате кириллица становится вида "ПароР"
Я пересохранил в Win UTF-8 с BOM и ваш скрипт нормально отработал, кроме одного файла (но у меня очень маленькая выборка пока из 10 случайных файлов, так то их десятки тысяч). От имени остался только конец после точки. Вот с таким
Код: Выделить весь код
<title>«The Secret Circle. The Temptation.» / «Тайный круг. Искушение.» :: Notabenoid.Com</title>
файл стал Com.htm
Наверное какие-то запрещенные символы остались. А до конвертации "Ошибка в синтаксисе команды" тоже проскакивало.
Хорошо бы сначала переконвертить все default.htm из Unix UTF-8 без BOM (Force) > Win UTF-8 с BOM. Не подскажете скрипт? Или может как-то явно указать эту кодировку в батнике.
Цитата Iska:
Мой вариант для UTF-8 »
Простите мою невежественность, это для Powershell? А как запускать?

Последний раз редактировалось deniskx, 19-01-2015 в 17:49.


Отправлено: 10:36, 19-01-2015 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата deniskx:
это для Powershell? »
Да.

Цитата deniskx:
А как запускать? »
Сохранить в файл с расширением «.ps1», заменив выделенное на путь к Вашим файлам. Однократно разрешить в PowerShell исполнение неподписанных скриптов (если не делали этого ранее). Затем можно пробовать исполнять (лучше сделать копию каталога Ваших файлов и пробовать именно на копии).
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:01, 19-01-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Переименовать файл по содержимому

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход