我正在尝试编写.cmd文件来获取文本文件并在每行的开头添加一个字符串,用ASCII控制代码30(RS)替换所有分号,然后用RS结束每一行通过ASCII码31(美国)。当我把RS和US放在文件中时,笔记本不会保存它,除非它是用Unicode格式的,但当我尝试用Unicode运行它时,它就不会运行。
以下是我的工作原理:
@echo on > Convert.txt & setLocal enableDELAYedexpansion
set old=;
set new=▲
set bgnstr=@TESTSTATS▲▲▲
set endstr=▲▼
for /f "tokens=* delims= " %%a in (test1.txt) do (
set str=%%a
set str=%BGNSTR%!str:%old%=%new%!%endstr%
>> Convert.txt echo !str!
)
如果我用RS / US替换任何其他字符,它就会按照我的意愿去做。
答案 0 :(得分:2)
您的脚本应按预期工作,但▲
和▼
不是ASCII控制代码:
▲ U+25B2 Black Up-Pointing Triangle
▼ U+25BC Black Down-Pointing Triangle
不幸的是,这里看不到ASCII控制代码30
(RS)和ASCII代码31
(US);因此从十六进制编辑器插入下一个屏幕截图。在下一个脚本中,bgnstr
变量略微缩短,以使mycharmap.bat
脚本的下一个输出保持可接受的长度。
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
set old=;
set "new="
set "bgnstr=@TS"
set "endstr="
> Convert.txt (
for /f "tokens=* delims= " %%a in (test1.txt) do (
set str=%%a
set str=%BGNSTR%!str:%old%=%new%!%endstr%
echo !str!
)
)
<强>输入/输出强>:
==> type test1.txt
a;b;c
d;e;f;
h;i;j
==> D:\bat\SO\39006271.bat
==> type Convert.txt
@TSabc
@TSdef
@TShij
ASCII控制代码在type Convert.txt
的输出中不可见;
下一个代码中的mycharmap.bat
脚本以及后面的屏幕截图显示了它们。 mycharmap.bat
脚本来自我在superuser.com上的回答:Full description of Windows Alt+x codes
==> for /F "skip=2 delims=" %G in ('type Convert.txt') do @mycharmap.bat "'%G'"
Ch Unicode Alt? CP IME Alt Alt0 IME 0405/cs-CZ; CP852; ANSI 1250
@ U+0040 64 …64… 64 064 Commercial At
T U+0054 84 …84… 84 084 Latin Capital Letter T
S U+0053 83 …83… 83 083 Latin Capital Letter S
U+001E …30… 030 Information Separator Two
U+001E …30… 030 Information Separator Two
U+001E …30… 030 Information Separator Two
h U+0068 104 …104… 104 0104 Latin Small Letter H
U+001E …30… 030 Information Separator Two
i U+0069 105 …105… 105 0105 Latin Small Letter I
U+001E …30… 030 Information Separator Two
j U+006A 106 …106… 106 0106 Latin Small Letter J
U+001E …30… 030 Information Separator Two
U+001F …31… 031 Information Separator One
@TShij
答案 1 :(得分:1)
JosefZ解释了箭头字符的含义,并在his answer中提供了有效的解决方案。
我想向您展示一种在运行时生成ASCII字符RS(0x1E
)和US(0x1F
)的方法,因此您无需将它们嵌入批处理文件中一个十六进制编辑。诀窍是使用forfiles
及其翻译十六进制的能力。出现在命令字符串参数中的格式为0xHH
的字符代码(例如,0x09
将在执行命令字符串之前被制表符字符替换);在命令提示符窗口中键入forfiles /?
并阅读/C
参数的说明。请注意,此方法不适用于所有ASCII控制字符。
所以这里是代码,包含几个解释性说明(rem
):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem /* Store RS and US characters in variables `RS` and `US`, respectively: */
for /F %%A in ('forfiles /P "%~dp0." /M "%~nx0" /C "cmd /C echo 0x1E"') do set "RS=%%A"
for /F %%A in ('forfiles /P "%~dp0." /M "%~nx0" /C "cmd /C echo 0x1F"') do set "US=%%A"
rem // The above generated characters are used here:
set "old=;"
set "new=%RS%"
set "bgnstr=@TS%RS%%RS%%RS%"
set "endstr=%RS%%US%"
rem // A single redirection is used to avoid multiple file accesses:
> "Convert.txt" (
rem /* The option string has been modified in order to reflect every line
rem as it appears in the file; not that empty lines still get lost: */
for /F usebackq^ delims^=^ eol^= %%A in ("test1.txt") do (
set "str=%%A"
rem // Toggle delayed expansion to not lose exclamation marks:
setlocal EnableDelayedExpansion
echo(%bgnstr%!str:%old%=%new%!%endstr%
endlocal
)
)
endlocal
exit /B