2017-04-09 3 views
1

나는 배치 파일을 썼다. 그곳에는 여러 변수에 설정된 텍스트 묶음을 넣었고 그 다음 줄은 그 변수를 텍스트 파일로 반향 출력했다.Windows/CMD | 예를 들어 줄을 끊는 방법. 문자 수에 도달 했습니까?

문제는 모든 내용을 하나의 긴 줄로 에코하여 읽는 것이 불가능하다는 것입니다 (랩 모드를 전환하도록 강요하지만 소프트웨어가 지원하지 않으면 어떻게됩니까?). 당신이 볼 수 있듯이, 가장 긴 라인이 76

"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit 
eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed 
aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla 
rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus 
sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia 
nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis 
sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi 
tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed 
ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque 
libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra 
euismod nisl, nec malesuada turpis pellentesque eget." 

:

echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra euismod nisl, nec malesuada turpis pellentesque eget." > text_file.txt 

그래서 내가 좋아하는 뭔가를 인쇄해야 (그냥 예를 살펴, 그것을 읽을 수 있어요). 중단 점 또는 무언가로 사용할 수 있습니까?

그러나 그것은 또한 단어 중간에 그것을자를 수 없음을 의미합니다.

업데이트 : Linux에서 동일한 질문과 대답을 발견했습니다. https://unix.stackexchange.com/questions/60219/is-there-a-command-line-tool-to-insert-line-breaks-into-a-long-stringfold이라는 명령이 있습니다. Windows에 대한 대안?

+0

허용되는 최대 길이 이전 공간에서 문자열을 자르는 방법을 프로그래밍하고 나머지 문자열이있는 한이 절차를 반복해야합니다. 이 방법에 문제가 있으면 여기에 코드를 게시하여 기꺼이 도와 드리겠습니다. – Aacini

+0

어떤 방법입니까? 방금 이론을 썼습니다. 나는 그 질문에서 물었던 것처럼 문자를 셀 수있는 방법을 알지 못한다. – user3108268

+0

Unix 도구'fold'와 비슷한 Windows 도구를 물어 보았습니다.이 도구는 주제를 벗어났습니다. 또한 적어도 첫 번째 단락에서 참조하는 배치 파일을 제공하는 것이 중요합니다. – Compo

답변

2

우연히, 나는 약 4 년 전 처음 배치를 배우기 시작할 때 이와 비슷한 것을 썼습니다. & 또는 ) 초를 받아 들일 수는 없지만 샘플 텍스트에는 아무 것도 없으므로 테스트 할만큼 신경 쓰지 않습니다.

문자열을 단일 매개 변수로 전달하십시오.

@echo off 
setlocal enabledelayedexpansion 

cls 
set unformattedText=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra euismod nisl, nec malesuada turpis pellentesque eget. 
set width=76 
set counter=0 
set slashN=^ 


if not [%1]==[] set unformattedText=%~1 

:wordCounter 
for /f "tokens=1,* delims= " %%A in ("%unformattedText%") do (
    if not "%%A"=="" (
     set words[!counter!]=%%A 
     set /a counter=!counter!+1 
     set unformattedText=%%B 
     goto wordCounter 
    ) else (
     goto loopBreak 
    ) 
) 

:loopBreak 
echo There are !counter! words in your sentence. 

set /a counter=!counter!-1 
for /l %%A in (0,1,!counter!) do (
    echo !words[%%A]!>tmp.txt 
    for %%J in (tmp.txt) do (
     set /a len[%%A]=%%~zJ 
     set /a len[%%A]-=2 
     del tmp.txt 
     if !len[%%A]! gtr %width% set /a width=!len[%%A]!+1 
    ) 
) 

:: -- Concatenate the words and spaces -- 
set newString= 
set stringLength=0 
for /l %%A in (0,1,!counter!) do (
    if %%A lss !counter! (
     set /a possLength=!stringLength!+!len[%%A]!+1 

     if !possLength! leq %width% (
      set newString=!newString!!words[%%A]! 
      set /a stringLength+=!len[%%A]!+1 
     ) else (
      set newString=!newString!!slashN!!words[%%A]! 
      set /a stringLength=!len[%%A]!+1 
     ) 
    ) else (
     set /a possLength=!stringLength!+!len[%%A]! 

     if !possLength! leq %width% (
      set newString=!newString!!words[%%A]! 
      set /a stringLength+=!len[%%A]! 
     ) else (
      set newString=!newString!!slashN!!words[%%A]! 
      set /a stringLength=!len[%%A]! 
     ) 
    ) 
) 

echo !newString! 
2

이 내 버전입니다 ...

편집 : 분할 방법은 이제 모든 프로그램에서 호출 할 수있는 서브 루틴에서 격리되도록 내가 코드를 수정했습니다.

서브 루틴은 허용되는 최대 길이 이전 공간에서 문자열을 자르고 나머지 문자열이있는 한이 절차를 반복합니다.

@echo off 
setlocal 

set longString="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra euismod nisl, nec malesuada turpis pellentesque eget." 

rem To show lines in screen: 
call :splitLines longString 76 

rem To store lines in a file: 
call :splitLines longString 76 > file.txt 

goto :EOF 


:splitLines string width 
setlocal EnableDelayedExpansion 
set "string=!%~1!" 

:nextLine 
    set /A "i=%~2+1" 

    :prevChar 
     set /A i-=1 
    if "!string:~%i%,1!" neq " " goto prevChar 

    echo !string:~0,%i%! 

    set /A i+=1 
    set "string=!string:~%i%!" 
if "!string:~%~2!" neq "" goto nextLine 

echo !string! 
exit /B 
+0

echo! string에서 중단됩니다! > file.txt – user3108268

+0

내 대답에 편집을 참조하십시오 ... – Aacini

+0

열심히 노력해 주셔서 감사합니다.하지만 '일시 중지'를 추가하면 '계속하려면 아무 키나 누르십시오.'라는 텍스트가 모두 인쇄됩니다. . . ' 결국 그것은 변수 안에있는 텍스트를 파일에 출력하지 않는다는 것을 의미하며 콘솔에있는 모든 것을 출력합니다. – user3108268