Como corrigir um problema diacrítico no prompt de comando?

5

Problema simplificado:

Eu tenho um arquivo chamado Bíblia sagrada.exe (observe o í ) em C:\ do meu computador.

Quando eu abrir um prompt de comando em C:\ e executar dir /b /on B*.* , ele retornará:

Bíblia sagrada.exe

ou seja, sem problemas com símbolos diacríticos.

Mas quando eu faço dir /b /on B*.* > c: \ a.txt e abra c:\a.txt com o Bloco de Notas, ele se torna:

B¡blia sagrada.exe

isto é, substitui í por ¡ .

E se eu executar for /f "delims=" %i in ('dir /b /on B*.*') do %i > %i.txt , ele coloca o nome correto no nome do arquivo, mas dentro dele o texto ainda está errado, ou seja,

Nome do arquivo:

Bíblia sagrada.exe.txt

Conteúdo:

B¡blia sagrada.exe

O que está acontecendo?

PS:

problema real

O problema para mim é pior do que eu relatei na primeira edição, porque eu li o conteúdo de um arquivo txt para criar um script .vbs e depois para executá-lo; ao tentar executar, "não entende" que aponta para "Bíblia sagrada.exe" e não executa o programa ... ie, criei um .bat em 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

A mencionada "Bíblia sagrada.exe" está em d: \ Bíblia sagrada.

O arquivo .vbs gerado está abaixo (suponha que existam apenas esses dois diretórios em d :), com o nome de arquivo 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 

O problema? O atalho não é criado porque não reconhece "sLinkFile=" C: \ Usuários \ Ubirajara \ AppData \ Roaming \ Microsoft \ Windows \ Menu Iniciar \ Programas_pext1 \ B \ blia Sagrada \ B¡blia Sagrada.exe.lnk "" .

Isso não acontece se eu não usar diacríticos, mas na verdade eu tenho muitas pastas e arquivos com esses sinais ...

Como corrigir isso para permitir a escrita correta no arquivo .vbs?

PS2:

Eu tentei seguir os comandos, sozinhos e juntos, sem sucesso:

cmd /u

chcp 860

chcp 1200

mode con cp select=860

mode con cp select=1200

Também testei com a fonte cmd raster e com outras fontes disponíveis ...

    
por kokbira 22.08.2012 / 23:12

4 respostas

1

Definir a página de códigos como UTF-8 deve ajudar:

chcp 65001

O resultado dir será então codificado em UTF8.

Se o VBS não conseguir entendê-lo como está, para que o arquivo seja reconhecido automaticamente no Windows como UTF8, será necessário prefixá-lo com o Bytes da BOM UTF8 :

0xEF, 0xBB, 0xBF

Você pode começar com um arquivo contendo a lista de materiais e anexá-la em vez de escrever:

chcp 65001
copy EFBBBF.txt a.txt
dir /b /on B*.* >> a.txt

Ou você pode usar copy /b para concatenar os arquivos.

    
por 18.05.2016 / 10:55
4

O Notepad está abrindo seu arquivo com a codificação incorreta. Tente abrir usando a caixa de diálogo Abrir e, na parte inferior, selecionando outras codificações:

ObservequeaMicrosoftusanomesnãopadrãoparaascodificações."Unicode" é, na verdade, UTF-16LE e "Unicode big endian" é, na verdade, UTF-16BE.

    
por 22.08.2012 / 23:26
1

Você pode contornar o problema adicionando /X a todos os comandos DIR .

Isso lhe dará o nome abreviado 8.3 (nome DOS) de todos os arquivos; todas as outras operações são válidas com este nome e não terão nenhum dos problemas da UTF.

    
por 19.05.2016 / 00:58
1

Para resolver a parte em que a fonte incorreta é mostrada no Bloco de Notas, é necessário usar a página de código, porque o Bloco de Notas usa o Ansi como padrão. Uma solução melhor é usar o Notepad ++, onde você pode mudar para a página de código desejada e, além disso, pode até mesmo mudar para um shell melhor com suporte para unicode, para que o erro não apareça para começar.

    
por 21.05.2016 / 19:56