繁体   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