2016-08-17 2 views
1

.cmd 파일을 작성하여 텍스트 파일을 만들고 각 줄의 시작 부분에 문자열을 추가하려고합니다. 모든 세미콜론을 ASCII 컨트롤 코드 30으로 바꿉니다. (RS)를 입력하고 RS와 ASCII 코드 31 (US)로 끝내십시오. RS와 US를 파일에 넣으면 노트북은 유니 코드에 있지 않으면 저장하지 않지만 유니 코드로 실행하려고하면 실행되지 않습니다. 내가 RS에 대한 다른 문자를 대체 할 경우대체하려고합니다. cmd 파일을 사용하여 txt 파일의 ASCII 컨트롤 문자 사용

@echo on > Convert.txt & setLocal enableDELAYedexpansion 

set old=; 
set new=▲ 
set [email protected]▲▲▲ 
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! 
) 

/미국, 그것은 내가 원하는 그것을 할 않습니다 여기

나는 그것이 작동하지 않는 무슨이다.

+0

'/ F는 "토큰 = * delims ="'구분자로서 공간을 형성; 토큰'*'과 함께 선행 공백 (탭은 제외)을 제거합니다. 너 저걸 원하니? – aschipfl

+0

변환하려고하는 파일에서 각 문자열은 자체 행에 있으므로 작업 중이 었습니다. –

답변

2
스크립트가 예상대로 작동합니다

하지만 하지 ASCII 제어 코드입니다 :

▲ U+25B2 Black Up-Pointing Triangle 
▼ U+25BC Black Down-Pointing Triangle 

불행하게도, 어느 ASCII 제어 코드 30 (RS)도 ASCII 코드 31 (미국) 여기에서 볼 수 있습니다; 따라서 16 진수 편집기에서 다음 스크린 샷을 삽입했습니다. 다음 스크립트에서는 mycharmap.bat 스크립트의 다음 출력을 허용 가능한 길이로 유지하기 위해 bgnstr 변수가 약간 짧아집니다.

@ECHO OFF 
SETLOCAL EnableExtensions EnableDelayedExpansion 
set old=; 
set "new=" 
set "[email protected]" 
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

JosefZ 화살표 문자가 무엇인지 설명하고 his answer에서 작동하는 솔루션을 제공합니다.

ASCII 문자 RS (0x1E) 및 미국 (0x1F)을 런타임에 생성하는 방법을 보여주기 위해 16 진수 배치 파일에 포함 할 필요가 없습니다. 편집자. 트릭은 forfiles과 그 기능을 사용하여 16 진수를 변환하는 것입니다. 명령 문자열 인수에 나타나는 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 "[email protected]%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 
관련 문제