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

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

Ответить
Настройки темы
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Старожил


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

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


Изменения
Автор: shadowbat
Дата: 22-03-2019
Помогите доделать скрипт, чтобы в заданной папке поменять кодировку с ANSI на Unicode у всех файлов
с выбором фильтра, например только "*.txt" файлы или только "*.ini" или только "*file*.txt"

тут в примере только по одному файлу вручную забивать, да и "%tmp%" не работает, приходится писать "set tmp=D:\1.txt"
Код: Выделить весь код
:ToUNICODE src dst -- converts a file to UNICODE
::                 -- src [in]     - source file name to be converted
::                 -- trg [in,opt] - target file name, leave blank for in-place conversion
SETLOCAL
set src=%~1
set trg=%~2
set tmp=%temp%.\%~nx1
if "%trg%"=="" set trg=%src%
cmd /U /c type "%src%">"%tmp%"
move /y "%tmp%" "%trg%"
EXIT /b

Отправлено: 20:54, 22-03-2019

 

Аватара для yurfed

Ветеран


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

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


shadowbat, iconv.exe в качестве альтернативы не смотрели.
Точно её возможности не знаю, но посмотреть можно.
самый простой пример
Код: Выделить весь код
iconv -c -f utf-8 -t cp1251 1.txt 1>2.txt
Более сложный через ТЕМП, если проблемы
Код: Выделить весь код
 iconv -c -f utf-8 -t cp1251 1.txt 1>1.tmp && move 1.tmp 1.txt

-------
Хочу ли я - Могу ли я - Говно ли я - Магнолия


Последний раз редактировалось yurfed, 22-03-2019 в 21:58.


Отправлено: 21:41, 22-03-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


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

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


Цитата shadowbat:
в заданной папке »
Только в самом каталоге, без обработки вложенных в него, так?

Цитата shadowbat:
на Unicode »
На какой Юникод? Их много. Судя по коду — Вам нужен UTF-16LE/1200, так? BOM Вам нужен или нет?

В общем и целом — используйте PowerShell для решения данной задачи.

Отправлено: 21:47, 22-03-2019 | #3


Старожил


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

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


Цитата Iska:
Только в самом каталоге, без обработки вложенных в него, так? »
Со всеми вложенными подкаталогами
Да, можно UTF-16LE/1200
Можно с BOM

Но, насколько я понимаю "cmd /U /c type" не позволяет настраивать такие параметры как вид Юникода и BOM? и создаёт UTF-16LE/1200 без BOM, это не критично

Цитата Iska:
используйте PowerShell для решения данной задачи. »
Это же можно сделать и через bat?

Последний раз редактировалось shadowbat, 22-03-2019 в 22:10.


Отправлено: 22:00, 22-03-2019 | #4


Ветеран


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

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


Как-то так (без каких-либо проверок):
Код: Выделить весь код
Get-ChildItem -Path 'C:\Мои проекты\0254' -Recurse -Filter '*.txt' -File |`
    ForEach-Object -Process {
        $sContent = Get-Content -Path $_.FullName
        Set-Content -Path $_.FullName -Value $sContent -Encoding Unicode
    }
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:12, 22-03-2019 | #5


Старожил


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

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


Вложения
Тип файла: zip iconv.zip
(682.4 Kb, 31 просмотров)

1.
Для одной папки работает, как сделать, чтобы он работал на папку с подкаталогами? (нужно добавить в %PATH% путь к iconv)
Код: Выделить весь код
set dirr=C:\111\
for %%i in (*.txt) do iconv --binary -f cp1251 -t utf-16 "%%i" > %dirr%/%%i
2.
Как добавить сюда работу с подкаталогами? (без добавления в %PATH%)
Работает только для одной папки

all.cmd:
Код: Выделить весь код
for /R %%i in (.) do call txt.cmd %%i
txt.cmd:
Код: Выделить весь код
set cd2=%cd%
cd %1
for %%j in (*.txt) do call %cd2%\iconv2.cmd %%j
cd %cd2%
iconv2.cmd:
Код: Выделить весь код
iconv -c -f KOI8-R -t CP1251 %1 > win.%1 
del %1
rename win.%1 %1

Последний раз редактировалось shadowbat, 23-03-2019 в 07:59.


Отправлено: 01:24, 23-03-2019 | #6


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата shadowbat:
Для одного файла работает »
Работает?! Так не бывает...вернее, в таком виде работать не будет и не должно...

Цитата shadowbat:
Это же можно сделать и через bat? »
Можно поинтересоваться почему именно в cmd требуется? В смысле, не совсем понятно, зачем привлекать в систему посторонние средства, если в ней уже заложены инструменты для решения задачи?

CMD
утилита iconv имеет свой синтаксис, скачивать её для проверки - нет желания, так что проверьте строку для её запуска, перед использованием...
Код: Выделить весь код
set "fld=c:\1\"
set "flt=*.txt"

pushd "%fld%"
for /f "delims=" %%x in ('dir /b/s/a-d "%flt%"') do (
    iconv --binary -f windows-1251 -t UTF-8 %%x
)
popd
Powershell
Выше предложили уже вариант на powershell...
Его можно ускорить в обработке:
Код: Выделить весь код
$fld = 'c:\1'
$flt = '*.txt'
# default - кодировка активной кодовой страницы системы.
$encin = 'default'
# unicode - кодировка UTF-16 LE
$encout = 'unicode'

dir $fld -filt $flt -file -rec|%{
    ($content = gc $_.fullname -enc $encin -raw)|
    sc $_.fullname -enc $encout
}
либо немного другой вариант, с более широкими возможностями в выборе кодировки:
Код: Выделить весь код
$fld = 'c:\1'
$flt = '*.txt'
# Доступные кодировки: [text.encoding]::getencodings()
$encin = [text.encoding]::getencoding("windows-1251")
$encout = [text.encoding]::getencoding("utf-16")

filter recode-file {
	$content = [io.file]::readalltext($_.fullname, $encin)
	[io.file]::writealltext($_.fullname, $content, $encout)
}

dir $fld -filt $flt -file -rec|recode-file
- кроме того, этот вариант не добавляет пустую строку в конец файла...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 23-03-2019 в 09:05.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:38, 23-03-2019 | #7


Старожил


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

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


cmd:
Код: Выделить весь код
chcp 1251
set "fld=C:\111\"
set "flt=*.txt"
pushd "%fld%"
for /f "delims=" %%x in ('dir /b/s/a-d "%flt%"') do (
chcp 1251 > nul
    CMD /U /C Type "%%x" > "%%xtemp"
del "%%x"
move "%%xtemp" "%%x"
)
iconv: (нужно добавить путь к папке, в которой лежит iconv.exe в Мой компьютер - свойства - дополнительные параметры системы - переменные среды - Path - изменить - изменить текст - добавить ;C:\iconv\ )
Код: Выделить весь код
chcp 1251
set "fld=C:\111\"
set "flt=*.txt"
pushd "%fld%"
for /f "delims=" %%x in ('dir /b/s/a-d "%flt%"') do (
    iconv --binary -f windows-1251 -t UTF-16LE "%%x" > "%%xtemp"
del "%%x"
move "%%xtemp" "%%x"
)



Цитата YuS_2:
Можно поинтересоваться почему именно в cmd требуется? »
Хотя бы затем, что представленные в этой теме PS скрипты в Win7 требуют Windows Management Framework 3.0 (KB2506143) + есть вероятность необходимости настраивать Set-ExecutionPolicy
Никто же не говорит, что решение на PS плохое или нерабочее, но почему бы не иметь два разных вида решений (PS и bat), и уже из них выбирать?



Прогон на тестовой сборке:
cmd 141сек UTF-16LE-BOM
iconv 95сек UTF-16LE-BOM
PowerShell ($sContent = Get-Content) 60сек UTF-16LE+BOM, лишняя строка в конце
PowerShell ($content = gc) 47сек UTF-16LE+BOM, лишняя строка в конце
PowerShell ($content = [io.file]) 40сек UTF-16LE+BOM

все пять решений работают с подпапками в режиме замены старых файлов

Последний раз редактировалось shadowbat, 23-03-2019 в 17:16.


Отправлено: 16:51, 23-03-2019 | #8


Ветеран


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

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


Цитата shadowbat:
почему бы не иметь два разных вида решений (PS и bat), и уже из них выбирать? »
для bat нет решения
расставить везде стороннее приложение и запускать его - это не "через bat", и по сложности аналогично обновлению PoSh до актуальной версии

переписать под старую версию PoSh несложно
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:46, 23-03-2019 | #9


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Busla:
переписать под старую версию PoSh несложно »
я бы сказал архинесложно
Код: Выделить весь код
...
dir $fld -filt $flt -rec|%{!$_.psiscontainer}|recode-file

-------
scio me nihil scire. Ѫ


Отправлено: 18:02, 23-03-2019 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Какой прогр. или фильтром исправить такое ? micro8 Видео и аудио: обработка и кодирование 4 27-11-2012 21:35
VBS/WSH/JS - [решено] ansi в utf-8 aggressor_ Скриптовые языки администрирования Windows 3 19-10-2012 06:46
В Windows 8 появится функция проверки файлов фильтром SmartScreen OSZone News Новости и события Microsoft 0 09-04-2011 11:30
Графика - Графический конвертер с фильтром прозрачности. killmuk Программное обеспечение Windows 0 02-11-2008 14:16
Nvidia GeForce 6100 Onboard - Проблема с фильтром дыма Cone Видеокарты 14 05-11-2007 19:30




 
Переход