Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] конвертировать ANSI в Unicode с фильтром (http://forum.oszone.net/showthread.php?t=339798)

shadowbat 22-03-2019 20:54 2864641

конвертировать ANSI в Unicode с фильтром
 
Помогите доделать скрипт, чтобы в заданной папке поменять кодировку с 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 22-03-2019 21:41 2864649

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

Iska 22-03-2019 21:47 2864652

Цитата:

Цитата shadowbat
в заданной папке »

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

Цитата:

Цитата shadowbat
на Unicode »

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

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

shadowbat 22-03-2019 22:00 2864656

Цитата:

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

Со всеми вложенными подкаталогами
Да, можно UTF-16LE/1200
Можно с BOM

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

Цитата:

Цитата Iska
используйте PowerShell для решения данной задачи. »

Это же можно сделать и через bat?

Iska 22-03-2019 22:12 2864660

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

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 23-03-2019 01:24 2864678

Вложений: 1
  • iconv.zip (682.40 KB, скачиваний: 43)
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


YuS_2 23-03-2019 08:38 2864685

Цитата:

Цитата 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

- кроме того, этот вариант не добавляет пустую строку в конец файла...

shadowbat 23-03-2019 16:51 2864754

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

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

Busla 23-03-2019 17:46 2864760

Цитата:

Цитата shadowbat
почему бы не иметь два разных вида решений (PS и bat), и уже из них выбирать? »

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

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

YuS_2 23-03-2019 18:02 2864763

Цитата:

Цитата Busla
переписать под старую версию PoSh несложно »

я бы сказал архинесложно :)
Код:

...
dir $fld -filt $flt -rec|%{!$_.psiscontainer}|recode-file


shadowbat 23-03-2019 18:07 2864765

Цитата:

Цитата Busla
для bat нет решения »

первый код в сообщении #8


Время: 23:19.

Время: 23:19.
© OSzone.net 2001-