簡體   English   中英

Windows / CMD | 如果達到字符數該如何換行?

[英]Windows/CMD | How to break line if e.g. character count reached?

我寫了一個批處理文件,在其中放入了一堆被設置為某個變量的文本,然后下一行將該變量回顯到文本文件中。

問題在於它會將所有內容都回盪成一條長行,並且無法讀取(它會迫使您切換換行模式,但是如果軟件不支持該模式,該怎么辦)。

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

(只是看這個例子,這是不可讀的)

所以我需要將其打印為以下內容:

"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." 

如您所見,最長的行是76字符。 是否可以將其用作斷點或其他東西?

但這也意味着它不能在單詞中間切碎。

更新:我在Linux https://unix.stackexchange.com/questions/60219/is-there-a-command-line-tool-to-insert-line-breaks-into-a-long-字符串該命令稱為fold Windows的替代品嗎?

巧合的是,大約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!

這是我的版本

編輯 :我修改了代碼,因此split方法現在隔離在任何程序都可以調用的子例程中。

該子例程在最大允許長度之前的空格處剪切字符串,並在有剩余字符串的情況下重復此過程。

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM