Как исправить проблему с диакритическими знаками в командной строке?
Упрощенная проблема:
У меня есть файл с именем Bíblia sagrada.exe
(Обратите внимание í
) на C:\
моего компьютера.
Когда я открываю командную строку на C:\
и выполнить dir /b /on B*.*
, он вернется:
Bíblia sagrada.exe
нет проблем с диакритическими символами.
Но, когда я делаю dir /b /on B*.*
> c:\a.txt и открыть c:\a.txt
с помощью блокнота это становится:
B¡blia sagrada.exe
т.е. он заменяет í
с ¡
,
И если я выполню for /f "delims=" %i in ('dir /b /on B*.*') do %i > %i.txt
он помещает правильное имя в имя файла, но внутри него текст по-прежнему неверен, т.е.
Имя файла:
Bíblia sagrada.exe.txt
Содержание:
B¡blia sagrada.exe
В чем дело?
PS:
Реальная проблема
Проблема для меня хуже, чем я сообщал при первом редактировании, потому что я читаю содержимое txt-файла, чтобы создать сценарий.vbs, а затем выполнить его; при попытке выполнить "он не понимает", что он указывает на "Bíblia sagrada.exe" и не выполняет программу... т. е. я создал.bat на d:\atalhizador\atalhizador.bat:
@echo off
::locais
set drvbak=
set drvprogrs=
set pathbak=%cd%
set pathabove=
set pathprogrs=%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
::identificador da pasta do programa no menu iniciar
set id=_pext1
::determina drives de acordo com paths
for /f "delims=" %%z in ("%pathbak%") do set drvbak=%%~dz
for /f "delims=" %%z in ("%pathprogrs%") do set drvprogrs=%%~dz
::pega caminho superior
cd..
set pathabove=%cd%
cd %pathbak%
cls
echo.***************
echo.* ATALHIZADOR *
echo.***************
echo.
echo.Deseja realmente executar o atalhizador para a pasta:
cd..
echo. %cd%
cd %pathbak%
echo. [s/n]:
set /p ___o=
if not "%___o%"=="s" if not "%___o%"=="S" goto end
echo.
echo.Criando os atalhos...
for /f "delims=" %%a in ('dir /b /ad /on ..') do (
echo.- pasta "%%a"...
echo. ^|-- buscando arquivos atalhizaveis...
if not exist "temp" mkdir "temp"
dir /b /on "..\%%a\*.exe" 1>temp\busca.txt 2>temp\erros.txt
for /f "delims=" %%b in (temp\busca.txt) do (
echo. ^|-- criando atalho para %%b
for /l %%z in (1,1,1) do set __temp__=
if not exist "%pathprogrs%\%id%" mkdir "%pathprogrs%\%id%"
if not exist "%pathprogrs%\%id%\%%a" mkdir "%pathprogrs%\%id%\%%a"
echo.Set oWS = WScript.CreateObject^("WScript.Shell"^) > temp\%%~na-%%~nb.vbs
echo.sLinkFile = "%pathprogrs%\%id%\%%a\%%b.lnk" >> temp\%%~na-%%~nb.vbs
echo.Set oLink = oWS.CreateShortcut^(sLinkFile^) >> temp\%%~na-%%~nb.vbs
echo.oLink.TargetPath = "%pathabove%\%%a\%%b" >> temp\%%~na-%%~nb.vbs
echo.oLink.Save >> temp\%%~na-%%~nb.vbs
cscript /nologo temp\%%~na-%%~nb.vbs
)
)
:end
%drvbak%
cd %pathbak%
pause
@echo off
Упомянутый "Bíblia sagrada.exe" находится в d:\Bíblia sagrada.
Сгенерированный файл.vbs находится ниже (предположим, что на d:) есть только эти два каталога с именем файла D:\atalhizador\temp\Bíblia Sagrada-Bíblia Sagrada.vbs:
Set oWS = WScript.CreateObject("WScript.Shell")
sLinkFile = "C:\Users\Ubirajara\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\_pext1\B¡blia Sagrada\B¡blia Sagrada.exe.lnk"
Set oLink = oWS.CreateShortcut(sLinkFile)
oLink.TargetPath = "D:\_pext1\B¡blia Sagrada\B¡blia Sagrada.exe"
oLink.Save
Проблема? Ярлык не создан, потому что он не распознает "sLinkFile = "C:\Users\Ubirajara\AppData\Roaming\Microsoft\Windows\ Меню Пуск \Programs_pext1\B¡blia Sagrada\B¡blia Sagrada.exe.lnk"",
Этого не произойдет, если я не использую диакритические знаки, но на самом деле у меня много папок и файлов с этими сигналами...
Как исправить это, чтобы разрешить правильную запись в файл.vbs?
PS2:
Я попробовал следующие команды, в одиночку и вместе, но безуспешно:
cmd /u
chcp 860
chcp 1200
mode con cp select=860
mode con cp select=1200
Также я попробовал это с шрифтом растрового CMD и с другими доступными шрифтами...
4 ответа
Установка кодовой страницы в UTF-8 должна помочь:
chcp 65001
dir
Затем результат будет закодирован в UTF8.
Если VBS не может понять его как есть, для того, чтобы файл автоматически распознавался в Windows как UTF8, вам нужно будет поставить перед ним префикс байтами спецификации UTF8:
0xEF, 0xBB, 0xBF
Затем вы можете начать с файла, содержащего спецификацию, и добавить к нему вместо записи:
chcp 65001
copy EFBBBF.txt a.txt
dir /b /on B*.* >> a.txt
Или вы можете использовать copy /b
объединить файлы.
Блокнот открывает файл с неверной кодировкой. Попробуйте открыть с помощью диалогового окна "Открыть" и в нижней части выберите другие кодировки:
Обратите внимание, что Microsoft использует нестандартные имена для кодировок. "Unicode" на самом деле UTF-16LE, а "Unicode big endian" на самом деле UTF-16BE.
Вы можете обойти проблему, добавив /X
все DIR
команды.
Это даст вам 8.3 короткое имя (DOS-имя) всех файлов; все дальнейшие операции допустимы с этим именем, и у него не будет никаких проблем с UTF.
Чтобы решить ту часть, где неправильный шрифт отображается в Блокноте, вам нужно использовать кодовую страницу, потому что Блокнот использует Ansi по умолчанию. Лучшее решение - это использовать Notepad++, где вы можете перейти на понравившуюся кодовую страницу, и, кроме того, вы можете даже перейти на более качественную оболочку с поддержкой юникода, чтобы ошибка не возникала с самого начала.