试图替换;使用cmd文件在txt文件中使用ASCII控制字符

时间:2016-08-17 21:05:33

标签: windows batch-file text unicode ascii

我正在尝试编写.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替换任何其他字符,它就会按照我的意愿去做。

2 个答案:

答案 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!
  )
)

script in hexadecimal

<强>输入/输出

==> 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

printscreen

答案 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