Rumata, да это достаточно очевидный подход.
Но ещё есть вопрос, в какой кодировке файлы. Если в UTF-16, то я не знаю, как читать файл построчно напрямую (CMD.EXE /U, по-моему, влияет только на вывод, но не на ввод); можно конечно преобразовать в однобайтную кодировку и обратно, но при этом возможны потери.
В случае UTF-8 затруднений быть не должно (хотя, кто его знает), т.к. в этом случае разделитель строк тот же, что и в однобайтовой кодировке и можно тупо прочесть строку из одного файла и сразу же записать в другой, не вникая, из каких кракозябров она состоит.
Впрочем, на основании этого пришла мысль насчёт обработки UTF-16 не через однобайтную кодировку, а через UTF-8:
chcp 65001>nul & cmd /c type "utf16_with_bom.txt">"ut8_without_bom.txt" & chcp 866>nul
rem Обработка ut8_without_bom.txt
rem . . .
::set /p x={Заменить эти скобки на BOM, если он нужен}>"utf16.txt" <nul
chcp 65001>nul & cmd /u /c type "ut8_without_bom.txt">>"utf16.txt" & chcp 866>nul
Но, возможно, более правильным решением было бы не перебрасывать данные с места на место, а лишь уменьшить размер файла до необходимого, но как это сделать (и не только через CMD), я по неопытности не знаю, так что самому интересно. (Или это всё-таки неправильно с точки зрения дефрагментации?)