所以我想以黄色打印Jäger炸弹和maçã,其余部分是标准白色。我的代码是:
SETLOCAL EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
call :colorEcho 0e "Jäger bomb"
echo Jäger bomb
call :colorEcho 0e "maçã"
echo maçã
pause
exit
:colorEcho
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1i
问题是,当它输出时输出为“J,,ger
”,并出现错误“FINDSTR: Cannot open maøa
”。但是使用标准的echo命令都可以打印出来。造成这种情况的原因是什么?如何解决?非常感谢任何帮助!
答案 0 :(得分:4)
您需要在批处理脚本的开头添加chcp命令,告诉代码页您的脚本文件的编码。
如果您将脚本保存在utf-8上,请添加:chcp 65001&gt; NUL
如果您将脚本保存在ansi上:chcp 1252&gt; NUL
cmd需要使用声明的代码页而不是系统代码页来解释批处理文件的扩展字符。
(用notepad ++保存下一个脚本):
@Echo Off
::This script file is encoded using utf-8
chcp 65001 >nul
::
::Call :Color A "######" \n E "" C " 23 " E "!" \n B "#&calc" \n
Call :Color 0e "Jäger bomb" \n
call :Color 0e "maçã" \n
Pause >Nul
Exit /B
:Color
:: v23c
:: Arguments: hexColor text [\n] ...
:: \n -> newline ... -> repeat
:: Supported in windows XP, 7, 8.
:: This version works using Cmd /U
:: In XP extended ascii characters are printed as dots.
:: For print quotes, use empty text.
SetLocal EnableExtensions EnableDelayedExpansion
Subst `: "!Temp!" >Nul &`: &Cd \
SetLocal DisableDelayedExpansion
Echo(|(Pause >Nul &Findstr "^" >`)
Cmd /A /D /C Set /P "=." >>` <Nul
For /F %%# In (
'"Prompt $H &For %%_ In (_) Do Rem"') Do (
Cmd /A /D /C Set /P "=%%# %%#" <Nul >`.1
Copy /Y `.1 /B + `.1 /B + `.1 /B `.3 /B >Nul
Copy /Y `.1 /B + `.1 /B + `.3 /B `.5 /B >Nul
Copy /Y `.1 /B + `.1 /B + `.5 /B `.7 /B >Nul
)
:__Color
Set "Text=%~2"
If Not Defined Text (Set Text=^")
SetLocal EnableDelayedExpansion
For %%_ In ("&" "|" ">" "<"
) Do Set "Text=!Text:%%~_=^%%~_!"
Set /P "LF=" <` &Set "LF=!LF:~0,1!"
For %%# in ("!LF!") Do For %%_ In (
\ / :) Do Set "Text=!Text:%%_=%%~#%%_%%~#!"
For /F delims^=^ eol^= %%# in ("!Text!") Do (
If #==#! EndLocal
If \==%%# (Findstr /A:%~1 . \` Nul
Type `.3) Else If /==%%# (Findstr /A:%~1 . /.\` Nul
Type `.5) Else (Cmd /A /D /C Echo %%#\..\`>`.dat
Findstr /F:`.dat /A:%~1 .
Type `.7))
If "\n"=="%~3" (Shift
Echo()
Shift
Shift
If ""=="%~1" Del ` `.1 `.3 `.5 `.7 `.dat &Goto :Eof
Goto :__Color
答案 1 :(得分:3)
错误是FINDSTR命令限制的结果,如https://stackoverflow.com/a/8844873/1012053所述。以下是广泛答案的相关部分,其中最重要的部分是 粗体斜体
命令行参数的字符限制 - 扩展ASCII转换
空字符(0x00)不能出现在任何字符串中 在命令行上。任何其他单字节字符都可以出现在 字符串(0x01 - 0xFF)。 但是,FINDSTR会转换许多扩展的ASCII 它在命令行参数中找到的其他字符 字符。 这在两个方面产生了重大影响:
1)如果使用的话,许多扩展的ASCII字符将不匹配 命令行上的搜索字符串。这种限制是相同的 文字和正则表达式搜索。如果搜索字符串必须包含扩展名 ASCII,然后应该使用
/G:FILE
选项。2)如果名称包含扩展的ASCII字符并且在命令行中指定了文件名,FINDSTR可能无法找到文件。 如果要搜索的文件包含名称中的扩展ASCII,则表示 应该使用
/F:FILE
选项。
因此,可以通过将文件名写入文件并使用/F:file
选项来解决问题。
请注意,无需为每个调用编写带有退格符的新文件。如果将字符串视为文件夹,则可以使用名为@的常量文件,然后附加\..\@
。您的@文件内容应包含6个退格符,以返回所需的字符串。
无法在&#34; files.txt&#34;中引用文件路径。文件。如果您的字符串包含像&
这样的毒药字符,则可能会出现问题。所以我将字符串存储在引号内的变量中,然后使用不带引号的延迟扩展进行写入以保留毒性字符。
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in (
'"prompt #$H#$E# & echo on & for %%b in (1) do rem"'
) do (
set "DEL=%%a"
)
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%" > "@"
call :colorEcho 0e "Jäger bomb"
echo(
call :colorEcho 0e "maçã"
echo(
call :colorEcho 0e "this & that"
echo(
pause
exit /b
:colorEcho
setlocal
set "str=%~2"
>files.txt echo !str!\..\@
findstr /v /a:%1 /f:files.txt /r "^$"
此代码解决了您的直接问题,但代码仍然不是很强大。没有太多的想法,我知道会导致它失败的3件事
\
字符串中的任何位置/
字符串中的任何位置:
位于第二位我确定还有许多其他潜在的问题。
您可以在How to have multiple colors in a Windows batch file?找到更强大的代码 查看所有答案,因为主题有很多变化。 您可以选择自己喜欢的: - )