Есть ли способ с помощью сценария установки / пакета Windows / PowerShell, чтобы я мог проверить, является ли файл UTF-8, прежде чем передавать его для преобразования?
В качестве фона я в настоящее время работаю над устаревшим (японским) программным обеспечением Windows, разработанным с помощью Visual Studio 2005 (обновленного до Visual Studio 2017) на C ++.
Я имею дело с требованием, чтобы графический интерфейс мог отображать и вводить китайские символы. Таким образом было принято решение использовать UNICODE для кодирования проекта / решения.
Поскольку изначально в проекте использовался многобайтовый формат, для обеспечения обратной совместимости с UNICODE я решил закодировать файлы конфигурации (ini, dat, save файлы) в UTF-8, поскольку на эти файлы также ссылается веб-приложение.
Основные части программного обеспечения теперь готовы и работают, и у меня осталась одна последняя проблема - развертывание установщика более высокой версии.
В этом установщике (с помощью сценария установки) мне необходимо обновить файлы сохранения (ранее закодированные в SHIFT-JIS, поскольку эти файлы сохранения содержат текст на японском языке) до UTF-8.
Я уже создал командный файл в следующих строках, который преобразует SHIFT-JIS в UTF-8, который вызывается в последней части установщика и удаляется после преобразования.
@echo off
:: Shift_JIS -> UTF-8
setlocal enabledelayedexpansion
for %%f in ("%~dp0\savedfiles\*.sav") do (
echo %%~ff| findstr /l /e /i ".sav"
if !ERRORLEVEL! equ 0 (
powershell -nop -c "&{[IO.File]::WriteAllText($args[1], [IO.File]::ReadAllText($args[0], [Text.Encoding]::GetEncoding(932)))}" \"%%~ff" \"%%~ff"
)
)
Однако проблема заключается в том, что когда пользователь (1) обновляет, (2) удаляет (файлы .sav намеренно оставляются) и (3) повторно устанавливает программное обеспечение, файлы сохранения дважды перекодируются, что приводит к сбой программного обеспечения. (Японские символы UTF-8, обновленные во время (1) обновления, становятся символами мусора после (3) повторной установки.)
%~dp0
заменяется на путь к папке, всегда заканчивающийся обратной косой чертой. По этой причине никогда не объединяйте%~dp0
с дополнительным\
с именем файла / папки или шаблоном подстановки, так как это приводит к двум обратным косым чертам в полной строке аргумента, которые Windows должна исправить позже. Не используйтеf
в качестве переменной цикла, хотя это возможно, особенно при использовании модификатора типа~f
. Есть достаточно других символов, которые не являются модификаторами, доступных для использования в качестве переменной цикла. Отложенное расширение не требуется при использованииif not errorlevel 1
вместоif !ERRORLEVEL! equ 0
. - person Mofi   schedule 28.09.2020setlocal enabledelayedexpansion
может быть заменена наsetlocal EnableExtensions DisableDelayedExpansion
с использованиемif not errorlevel 1
внутри циклаfor
, что приводит к тому, что полные имена файлов, содержащие где-либо один или несколько!
, обрабатываются также правильно, что не относится к включенному отложенному расширению только из-за условияif
не используя рекомендуемый синтаксис, как описано в выводе команды IF при запускеif /?
в окне командной строки. Кстати:if not errorlevel 1
означает ЕСЛИ УРОВЕНЬ ОШИБКИ МЕНЬШЕ 1, что в общем случае ЕСЛИ УРОВЕНЬ ОШИБКИ РАВНО 0. - person Mofi   schedule 28.09.2020