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

5

Problema simplificado:

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

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

Bíblia sagrada.exe

ou seja, não há problemas com símbolos diacríticos.

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

B¡blia sagrada.exe

ou seja, ele substitui ípor ¡.

E se eu executar for /f "delims=" %i in ('dir /b /on B*.*') do %i > %i.txt, 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 relatei na primeira edição, porque li o conteúdo de um arquivo txt para criar um script .vbs e depois executá-lo; ao tentar executar, "não entende" que aponta para "Bíblia sagrada.exe" e não executa o programa ... ou seja, 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 haja 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 foi criado porque não reconhece "sLinkFile =" C: \ Usuários \ Ubirajara \ AppData \ Roaming \ Microsoft \ Windows \ Menu Iniciar \ Programas_pext1 \ Bblia Sagrada \ Bblia Sagrada.exe.lnk "" .

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

Como corrigi-lo para permitir a gravação correta no arquivo .vbs?

PS2:

Tentei seguir comandos, sozinhos e juntos, sem sucesso:

cmd /u

chcp 860

chcp 1200

mode con cp select=860

mode con cp select=1200

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

kokbira
fonte
certifique-se de adicionar uma fonte compatível. stackoverflow.com/questions/9321419/… por exemplo, Courier New e faça o download do DejaVu Sans Mono e do Droid Sans Mono, você pode adicioná-los 3. Os dois últimos teriam que ser baixados, se você quiser.
barlop 18/05/19

Respostas:

1

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

chcp 65001

O dirresultado será codificado em UTF8.

Se o VBS não conseguir entendê-lo como está, para que o arquivo seja automaticamente reconhecido no Windows como UTF8, será necessário prefixá-lo com os bytes da lista técnica do UTF8 :

0xEF, 0xBB, 0xBF

Você pode começar com um arquivo que contém a lista técnica e anexá-lo ao invés de escrever:

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

Ou você pode usar copy /bpara concatenar os arquivos.

harrymc
fonte
Embora o chcp 65001 troque o compilador c #. Suponho que isso não importe muito, a menos que eles executem o compilador c # nesse shell. veja "adicionou 2" em questão aqui stackoverflow.com/questions/30956834/…
barlop
Além disso, especificamente, alguém desejaria alterar a página de códigos para o redirecionamento de saída. O chcp altera ambos e sem parâmetros exibe a codificação de entrada. Um programa que apresenta e permite a troca de qualquer codificação é chcpa sourceforge.net/p/chcp-advanced/discussion/general/thread/...
barlop
Eu testei chcpe ele realmente trava o cmd, saindo sem nenhuma mensagem de erro quando você usa, por exemplo, dirdepois de chamá-lo. Mas se você redirecionar a saída para um arquivo, tudo bem e o arquivo de saída estará em UTF8. Eu tentei chcpa, mas não é reconhecido pelo Windows 7.
kokbira
Agora eu estou tentando a parte VBS de emissão ...
kokbira
Embora não seja uma resposta completa, porque ainda não consigo resolver a parte do VBS (preciso pensar mais), esta é a melhor resposta.
Kokbira # 23/16
4

O bloco de notas 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:

Seleção de codificação

Observe que a Microsoft usa nomes não padrão para as codificações. "Unicode" é realmente UTF-16LE e "Unicode big endian" é realmente UTF-16BE.

Caracol mecânico
fonte
Veja minha edição :) o problema é pior I escrito ...
kokbira
A abertura como sugerido também não resolve o "problema de exibição". No ANSI, o mesmo problema ocorre; em Unicode e Unicode big endian, nenhum caractere de alfabeto é mostrado; em UTF-8, que substitui ¡com , mas não com í... Ou seja, codificação correta "pode ser perdida" :(
kokbira
@kokbira se o bloco de notas não puder abri-lo, mesmo com uma fonte que deve mostrá-lo e mesmo quando você souber que está abrindo com a codificação apropriada correspondente a um bom unicode, se houver um, talvez não tenha sido gravado no arquivo Você pode tentar excluir todos os caracteres, exceto o engraçado, e usar xxd para ver como o personagem é gravado no arquivo. Você pode encontrar algo codificado incorretamente. por exemplo, algo usou uma fonte que não a suporta e substituiu esse caracter por outro e codificou algum outro caractere em seu lugar. O bloco de notas não foi o culpado quando o caractere errado foi mostrado.
Barlop 18/05/19
1

Você pode contornar o problema adicionando /Xa todos os DIRcomandos.

Isso fornecerá o nome abreviado 8.3 (nome DOS) de todos os arquivos; todas as operações adicionais são válidas com esse nome e não terá nenhum problema de UTF.

Aganju
fonte
talvez, mas você pode elaborar o que 8.3 tem a ver com UTF?
barlop 21/05
O nome 8.3 não tem caracteres especiais ou diacríticos, por isso, não haveria problemas entre diferentes programas que usam diferentes codificações UTF
Aganju
Percebo que, se o fizer dir 2012*.* /x , aparece o nome completo (mais de 8,3). E também, se eu fizer dir א /x, ele ainda mostra esse personagem. Portanto, não acho que / x esteja necessariamente executando 8.3 ou alterando caracteres para estar dentro de ascii.
barlop 21/05
Ele /Xprecisa estar antes do primeiro diretório ou arquivo, caso contrário, será considerado outro diretório a ser listado. No seu primeiro exemplo, seria DIR /X 2012*.*.
Aganju
1

Para resolver a parte em que a fonte incorreta é mostrada no bloco de notas, você precisa usar a página de códigos 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 que você gosta e, além disso, você pode até mudar para um shell melhor com suporte para unicode, para que o erro não ocorra inicialmente.

Frank Sixteen
fonte