3

Я хотел автоматизировать создание файла дерева каталогов в Windows 10.

В PowerShell я выполнил следующие команды:

cd  C:\TreeTest
tree /f > .\TreeStructure.txt

На выходе получился симпатичный файл UTF-8:

Довольно UTF-8 тест структуры дерева

Теперь я хотел сделать то же самое в командном файле:

@echo off
cd  C:\TreeTest
tree /f > .\TreeStructure.txt

Но в результате выполнения командного файла кодировка была испорчена:

Плохой тест древовидной структуры кодирования

Почему кодировка выходных данных PowerShell отличается от выходных данных пакетного файла?

Я знаю, что могу получить вывод ASCII, добавив /a к команде дерева, но я бы предпочел, чтобы симпатичный вывод UTF-8 был сохранен в моем файле дерева.

Я попытался изменить кодовую страницу, добавив "chcp 65001" в мой командный файл, но это не изменило вывод файла.

2 ответа2

3

Вы ошибаетесь, полагая, что ваш редактор Notepad++ считывает файл, созданный в PowerShell, как UTF8.

Это UTF16-LE/UCS-2 LE-BOM с спецификацией 0xFF 0xFE

Файл дерева, созданный в cmd.exe, кодируется в кодовой странице actice, смотрите вывод команды chcp и соответственно изменяйте кодировку в Notepad++ .

> chcp
Aktive Codepage: 850.

Изменить кодировку (в моем немецком языке Notepad++):

1

LotPing ответ правильный. Просто для подробного описания:

Оператор перенаправления > (отправить указанный поток в файл):

  • в Powershell кодировка выходного файла - UCS-2 LE BOM:

При записи в файлы операторы перенаправления используют кодировку Unicode . Если файл имеет другую кодировку, выходные данные могут быть отформатированы неправильно. Чтобы перенаправить содержимое в файлы, отличные от Unicode, используйте командлет Out-File с параметром Encoding .

Оболочка CMD может перенаправлять ASCII/ANSI (по умолчанию) или Unicode (UCS-2 le), но не UTF-8 .
Это можно выбрать, запустив CMD /A или CMD /U

Однако выходные данные довольно старомодной утилиты tree.com не готовы для преобразования в Unicode. Поэтому прямое start "" cmd /U /C "tree>tree_U.txt" прежнему создает (mojibake) искаженный файл в кодировке ANSI . Следующие команды cmd должны сделать свое дело:

tree>"%temp%\auxTree.txt"
start "" cmd /U /C "type "%temp%\auxTree.txt">tree_Unicode.txt"
del "%temp%\auxTree.txt"

Кстати, вот эти красивые персонажи и их коды (искаженные в ANSI):

Char Unicode  OEM  ANSI  UTF-8     Character_description
 ─   U+2500   196  n/a   0xE29480  Box Drawings Light Horizontal
 │   U+2502   179  n/a   0xE29482  Box Drawings Light Vertical
 └   U+2514   192  n/a   0xE29494  Box Drawings Light Up And Right
 ├   U+251C   195  n/a   0xE2949C  Box Drawings Light Vertical And Right

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .