배치 파일 : 파일을 읽는 방법?


97

배치 파일에서 파일 (텍스트 또는 바이너리)을 어떻게 읽을 수 있습니까? 바이너리 모드 또는 텍스트 모드로 읽는 방법이 있습니까?


@ RookieTEC9 : 예, 완전히 다른 두 가지라는 것을 알고 있지만 Windows NT (또는 최신 버전)가 아닌 msdos에서 작동하는 답변이 필요했습니다. 또한이 질문은 7 년 전에 질문되었습니다.이 질문을 염두에 두십시오
Lucas Gabriel 산체스

@ RookieTEC9 : 나는 당신이 옳다고 생각합니다. 난 그냥 MS-DOS 태그를 제거 할 수 있습니다
루카스 가브리엘 산체스

1
TYPE [fileName]MS-Dos에 대한 명령 을 사용할 수 있습니다 .
RookieTEC9

나를 위해 일한 그것에서 이것을 시도 - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

답변:


40

for 명령을 사용할 수 있습니다.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

유형

for /?

명령 프롬프트에서. 또한 ini 파일을 구문 분석 할 수 있습니다 !


25
이것은 설명을 제공하지 않고 특별히 서식이 지정된 텍스트 파일에서 매우 구체적인 정보를 구문 분석하는 매우 복잡한 예입니다. for /?명령에 따라 myfile.txt의 각 줄을 구문 분석하고 세미콜론으로 시작하는 줄을 무시하고 각 줄에서 두 번째 및 세 번째 토큰을 쉼표 및 / 또는 공백으로 구분 된 토큰과 함께 for 본문으로 전달합니다.
Martin Prikryl 2014

2
귀하의 예는 cmd.exe의 도움말입니다. 이에 대한 힌트를 추가하거나 전체 설명을 복사해야합니다.
Th. Thielemann

70

NT 스타일 cmd.exe에서 다음을 사용하여 텍스트 파일 줄을 반복 할 수 있습니다.

FOR /F %i IN (file.txt) DO @echo %i

자세한 내용을 보려면 명령 프롬프트에 "help for"를 입력하십시오. (사용중인 "DOS"에서 작동하는지 알 수 없음)


22
이어야합니다 %%i.
Jim Fell 2012

32
이 명령은 공백 문자를 발견하면 행 읽기를 종료합니다. 나는 결국 FOR / F "tokens = *"%% i IN (file.txt) DO @ECHO %% i
Jason을 사용하게

9
효과가있다! 콘솔을 사용하는 경우 박쥐 파일을 사용하는 경우 % i를 시도한 다음 %% i를 시도하십시오.
Steven Du

41

FOR-LOOP은 일반적으로 작동하지만 몇 가지 문제가 있습니다. FOR는 빈 줄을 허용하지 않으며 ~ 8190 이상의 줄은 문제가 있습니다. 확장은 지연된 확장이 비활성화 된 경우에만 안정적으로 작동합니다.

CR / LF 대 단일 LF의 감지도 약간 복잡해 보입니다.
또한 NUL 문자는 FOR-Loop이 즉시 읽기를 취소하므로 문제가 있습니다.

따라서 직접적인 이진 읽기는 거의 불가능 해 보입니다.

빈 줄의 문제는 트릭으로 해결할 수 있습니다. findstr 명령을 사용하여 각 줄에 줄 번호를 붙이고 읽은 후 접두사를 제거합니다.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

활성화하고 장애인 지연 확장 사이에 토글이 켜지지입니다 같은 문자열을 가진 안전 사용에 대한 !^^^xy!z.
그 라인 set "var=%%a"DisabledDelayedExpansion으로 만 안전 하기 때문입니다. 그렇지 않으면 느낌표가 제거되고 캐럿이 (보조) 이스케이프 문자로 사용되며 제거됩니다.
그러나 변수를 사용하여 var만 안전 EnabledDelayedExpansion 도 같이, call %%var%%같은 콘텐츠와 함께 실패합니다 "&"&.

편집 : set / p 변형 추가를 사용
하여 파일을 읽는 두 번째 방법이 있습니다 set /p. 유일한 단점은 줄당 ~ 1024 자로 제한되고 줄 끝에서 제어 문자를 제거한다는 것입니다.
그러나 장점은 지연된 토글이 필요하지 않고 변수에 값을 저장하는 것이 더 쉽다는 것입니다.

@echo off
setlocal EnableDelayedExpansion
set "file=%~1"

for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"

<%file% (
  for /l %%l in (1 1 !len!) do (
    set "line="
    set /p "line="
    echo(!line!
  )
)

"바이너리"를 16 진수 표현으로 읽으려면 SO : 배치 파일을 사용하여 바이너리 파일을 HEX 표현으로 변환하는
것을 볼 수 있습니다.


사용에 대한 포인터를 주셔서 감사합니다 set /p. 내가 사용하는 set /p value=< result.txt텍스트 파일의 첫 번째 라인을 얻을
SteveC

젭, 나는에 위의 솔루션을 기반으로 관련 질문 질문 stackoverflow.com/questions/11408295/...
니콜라스

EOF (파일 끝) 문자 인 ASCII는 0x1A어떻습니까? 않습니다 for /FNUL (와 같은 방식으로 행동 0x00) 문자를?
aschipfl

@aschipfl 0x1A가 어떤 경우에는 라인 피드처럼 동작한다고 가정합니다 (또는 라인 피드로 변환하는 것이 더 좋습니다). 임시 파일을 사용하지 않고 SUB를 만드는 방법이 있습니까?

이는 선이 시작하는 경우에도 절대 안전한입니다, 허용 대답을해야 :하거나 ;또는 포함!
HackingAddict1337

11

매우 쉬운 방법 중 하나는 다음 명령을 사용하는 것입니다.

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%

이렇게하면 텍스트 파일의 첫 번째 텍스트 줄만 표시됩니다. 다른 방법은 다음 명령을 사용하는 것입니다.

type %pathtotextfile%\textfile.txt

그러면 텍스트 파일의 모든 데이터가 화면에 표시됩니다. 도움이 되었기를 바랍니다!


1

많은 다른 방법이 있지만 텍스트를 표시하고 어디에도 저장하지 않으려면 다음을 사용하십시오. findstr /v "randomtextthatnoonewilluse" filename.txt


0

수정 된 코드 :

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause

페이지의 기본 코드. 따옴표가 올바르게 배치되지 않았으며 코드가 이름에 공백이있는 파일에 적합하지 않습니다. 내 것입니다. 나는 여기에 ^^^^의 트릭 제공
Celes

당신은 파일 이름 주위에 따옴표 맞아요,하지만 코드가 몇 가지 문제가 있습니다 eol=delims=불필요한 있습니다 set line=%%a따옴표를 사용하고 지연 확장 모드를 전환하지 않고해야이 코드는 느낌표를 읽을 수 없습니다

-5

화면에 myfile.txt 파일의 내용을 표시하는 코드

% filecontent % = 0
유형 % filename % >> % filecontent %
echo % filecontent % 설정


3
게시하기 전에 최소한 코드를 시도하십시오. 그건 말도 안돼.
Stephan

여기서 무슨 일이 일어나고 있습니까? 말이 안
돼요
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.