Batch file Can';无法获取äç;,或ã;使用colorEcho批量正确打印
所以我想用黄色打印Jäger bomb和maçã,其余部分为标准白色。我的密码是:Batch file Can';无法获取äç;,或ã;使用colorEcho批量正确打印,batch-file,colors,call,Batch File,Colors,Call,所以我想用黄色打印Jäger bomb和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 c
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
SETLOCAL EnableDelayedExpansion
对于/F“tokens=1,2 delims=#”%%a in(‘“prompt#$H#$E#&echo on&for%%b in(1)do rem“’)do(
设置“DEL=%%a”
)
呼叫:colorEcho 0e“杰格尔炸弹”
回声Jäger炸弹
电话:colorEcho 0e“maçã”
回声马萨昂
暂停
出口
:彩色回波
回音
"%~2"
findstr/v/a:%1/R“^$”“%~2”个
删除“%~2”>nul 2>&1i
问题是,当它输出时,它输出为“
J,,ger
”,并给出一个错误,表示“FINDSTR:cannotopen maøa
”。但是使用标准的echo命令,两者都可以很好地打印。这是什么原因造成的?我该如何修复它?非常感谢您的帮助 该错误是FINDSTR命令限制的结果,如中所述。以下是详细答案的相关部分,最重要的部分用粗体斜体显示
命令行参数的字符限制-扩展ASCII转换
空字符(0x00)不能出现在任何字符串中
在命令行上。任何其他单字节字符都可以出现在
字符串(0x01-0xFF)但是,FINDSTR会转换许多扩展ASCII码
它在命令行参数中找到的字符转换为其他字符
字符。这在两个方面产生了重大影响:
1) 许多扩展ASCII字符如果用作
命令行上的搜索字符串。这一限制同样适用于
文本和正则表达式搜索。如果搜索字符串必须包含扩展
ASCII,则应使用/G:FILE
选项
2)如果文件名包含扩展ASCII字符,并且在命令行上指定了文件名,FINDSTR可能无法找到文件。
如果要搜索的文件名称中包含扩展ASCII,则
/F:FILE
选项应改为使用。
因此,可以通过将文件名写入文件并使用/F:file
选项来解决问题
注意,不需要为每次调用编写带有退格字符的新文件。如果将字符串视为文件夹,然后附加\..\@
,则可以使用名为@的常量文件。@file内容应包含6个退格字符,以返回所需字符串
“files.txt”文件中不能引用文件路径。如果字符串包含有毒字符,如&
,则可能会导致问题。因此,我将字符串存储在一个带引号的变量中,然后使用不带引号的延迟扩展进行写入,以保留有毒字符
@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 "^$"
@echo关闭
setlocal EnableDelayedExpansion
对于/F“令牌=1,2 delims=#”%%a(
“((1)do rem中%%b的提示#$H#$E#和回显”
)做(
设置“DEL=%%a”
)
"@"
呼叫:colorEcho 0e“杰格尔炸弹”
回音(
电话:colorEcho 0e“maçã”
回音(
呼叫:colorEcho 0e“这个和那个”
回音(
暂停
退出/b
:彩色回波
setlocal
设置“str=%~2”
>files.txt echo!str!\\@
findstr/v/a:%1/f:files.txt/r“^$”
这段代码解决了您眼前的问题,但代码仍然不是很健壮
字符串中的任意位置\
字符串中的任意位置/
在第二个位置:
看看所有的答案,因为这个主题有很多变化。
您可以选择您的收藏夹:-)您需要在批处理脚本的开头添加chcp命令,告知脚本文件编码的代码页 如果在utf-8上保存脚本,请添加:chcp 65001>nul 如果在ansi上保存脚本,请添加:chcp 1252>nul cmd使用声明的代码页(而不是系统代码页)解释批处理文件的扩展字符时需要所有这些 (使用记事本++保存下一个脚本): 它产生:
@Echo关闭
::此脚本文件使用utf-8编码
chcp 65001>nul
::
::呼叫:颜色A“\n E”“C”23“E”!“\n B”#和计算”\n
呼叫:彩色0e“Jäger炸弹”\n
呼叫:颜色0e“maçã”\n
暂停>Nul
退出/B
:颜色
::v23c
::参数:hexColor文本[\n]。。。
::\n->换行…->重复
::在windows XP、7、8中受支持。
::此版本使用Cmd/U工作
::在XP中,扩展ascii字符打印为点。
::对于打印引号,请使用空文本。
SetLocal EnableExtensions EnableDelayedExpansion
Subst`:“!Temp!”>num&`:&Cd\
SetLocal DisableDelayedExpansion
回音(|)(暂停>数字和查找字符串“^”>`)
Cmd/A/D/C Set/P“=.”>>`Nul
复制/Y`.1/B+`.1/B+`.3/B`.5/B>Nul
复制/Y`.1/B+`.1/B+`.5/B`.7/B>Nul
)
:u颜色
设置“Text=%~2”
如果未定义文本(设置文本=^”)
SetLocal EnableDelayedExpansion
对于“&”“|”“>”中的%%uuu,我假设这是一个代码页问题。代码页1252修复了第一个示例,但没有修复第二个示例。我添加了它,它修复了echo命令,但没有修复coloEcho@TommyStewart,1252修正了我测试“Jäger炸弹”时的彩色回波.我给卡洛斯发了一条信息,看看他的最新版本是否能解决这个问题。我应该知道看看你的FINDSTR文档。真丢脸。
@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