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.txt
com 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 ...
fonte
Respostas:
Definir a página de códigos para UTF-8 deve ajudar:
O
dir
resultado 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 :
Você pode começar com um arquivo que contém a lista técnica e anexá-lo ao invés de escrever:
Ou você pode usar
copy /b
para concatenar os arquivos.fonte
chcp
e ele realmente trava o cmd, saindo sem nenhuma mensagem de erro quando você usa, por exemplo,dir
depois 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 tenteichcpa
, mas não é reconhecido pelo Windows 7.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:
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.
fonte
¡
com�
, mas não comí
... Ou seja, codificação correta "pode ser perdida" :(Você pode contornar o problema adicionando
/X
a todos osDIR
comandos.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.
fonte
dir 2012*.* /x
, aparece o nome completo (mais de 8,3). E também, se eu fizerdir א /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./X
precisa estar antes do primeiro diretório ou arquivo, caso contrário, será considerado outro diretório a ser listado. No seu primeiro exemplo, seriaDIR /X 2012*.*
.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.
fonte