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

Аватара пользователя
shadowbat

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

Сообщение shadowbat »

Помогите доделать скрипт, чтобы в заданной папке поменять кодировку с 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
Аватара пользователя
yurfed

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение yurfed »

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
Аватара пользователя
shadowbat

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение shadowbat »

Цитата shadowbat:



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




Только в самом каталоге, без обработки вложенных в него, так?




Цитата shadowbat:



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




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



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

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение Iska »

Цитата Iska:



Только в самом каталоге, без обработки вложенных в него, так?
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром




Со всеми вложенными подкаталогами

Да, можно UTF-16LE/1200

Можно с BOM



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




Цитата Iska:



используйте PowerShell для решения данной задачи.
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром




Это же можно сделать и через bat?
Аватара пользователя
shadowbat

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение shadowbat »

Как-то так (без каких-либо проверок):



Код:

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

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
    }
Аватара пользователя
Iska

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение Iska »

Как-то так (без каких-либо проверок):



Код:

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

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
    }
Аватара пользователя
shadowbat

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение shadowbat »

Цитата shadowbat:



Для одного файла работает
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром




Работает?! Так не бывает...вернее, в таком виде работать не будет и не должно...




Цитата shadowbat:



Это же можно сделать и через bat?
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром




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

- кроме того, этот вариант не добавляет пустую строку в конец файла...
Вложения
iconv.zip
(682.36 КБ) 0 скачиваний
iconv.zip
(682.36 КБ) 0 скачиваний
Аватара пользователя
YuS_2

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение YuS_2 »

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 требуется?
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром




Хотя бы затем, что представленные в этой теме 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

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение shadowbat »

Цитата shadowbat:



почему бы не иметь два разных вида решений (PS и bat), и уже из них выбирать?
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром




для bat нет решения

расставить везде стороннее приложение и запускать его - это не "через bat", и по сложности аналогично обновлению PoSh до актуальной версии



переписать под старую версию PoSh несложно
Аватара пользователя
Busla

Re: CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром

Сообщение Busla »

Цитата Busla:



переписать под старую версию PoSh несложно
CMD/BAT - [решено] конвертировать ANSI в Unicode с фильтром




я бы сказал архинесложно Изображение



Код:

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

...
dir $fld -filt $flt -rec|%{!$_.psiscontainer}|recode-file
Ответить

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