Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file Can';无法获取äç;,或ã;使用colorEcho批量正确打印_Batch File_Colors_Call - Fatal编程技术网

Batch file Can';无法获取äç;,或ã;使用colorEcho批量正确打印

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

所以我想用黄色打印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
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