5

Упрощенная проблема:

У меня есть файл с именем 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 ответа4

4

Блокнот открывает файл с неверной кодировкой. Попробуйте открыть с помощью диалогового окна «Открыть» и в нижней части выберите другие кодировки:

Выбор кодировки

Обратите внимание, что Microsoft использует нестандартные имена для кодировок. "Unicode" на самом деле UTF-16LE, а "Unicode big endian" на самом деле UTF-16BE.

1

Чтобы решить ту часть, где неправильный шрифт отображается в Блокноте, вам нужно использовать кодовую страницу, потому что Блокнот использует Ansi по умолчанию. Лучшее решение - это использование Notepad++, где вы можете перейти на понравившуюся кодовую страницу, и, кроме того, вы можете даже перейти на более качественную оболочку с поддержкой юникода, чтобы с самого начала не возникала ошибка.

1

Установка кодовой страницы в 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 для объединения файлов.

1

Вы можете обойти проблему, добавив /X ко всем командам DIR .

Это даст вам 8.3 короткое имя (DOS-имя) всех файлов; все дальнейшие операции действительны с этим именем, и у него не будет никаких проблем с UTF.

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