简化问题:
我的计算机上有一个名为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
这是怎么回事?
附言:
真正的问题
对我来说,这个问题比我第一次编辑时报告的更糟糕,因为我阅读了一个 txt 文件的内容来创建一个 .vbs 脚本,然后执行它;当尝试执行时,“它不明白”它指向“Bíblia sagrada.exe”并且它不执行该程序...即,我在 d:\atalhizador\atalhizador.bat 上创建了一个 .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\Start Menu\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 光栅字体和其他可用字体......
答案1
将代码页设置为 UTF-8 应该有帮助:
chcp 65001
结果dir
将以 UTF8 进行编码。
如果 VBS 无法按原样理解它,则为了使文件在 Windows 下自动识别为 UTF8,您需要在其前面加上UTF8 BOM字节:
0xEF, 0xBB, 0xBF
然后,您可以从包含 BOM 的文件开始并将其附加到其中,而不是写入:
chcp 65001
copy EFBBBF.txt a.txt
dir /b /on B*.* >> a.txt
或者您可以使用copy /b
来连接文件。
答案2
记事本正在使用错误的编码打开您的文件。请尝试使用“打开”对话框打开文件,并在底部选择其他编码:
请注意,Microsoft 使用非标准名称进行编码。“Unicode”实际上是 UTF-16LE,“Unicode big endian”实际上是 UTF-16BE。
答案3
您可以通过添加/X
到所有DIR
命令来规避该问题。
这将为您提供所有文件的 8.3 短名称(DOS 名称);使用此名称进行的所有进一步操作均有效,并且不会出现任何 UTF 问题。
答案4
要解决记事本中显示错误字体的问题,您需要使用代码页,因为记事本默认使用 Ansi。更好的解决方案是使用 Notepad++,您可以将其更改为您喜欢的代码页,最重要的是,您甚至可以更改为支持 unicode 的更好的 shell,这样错误就不会出现。