我写了一个批处理文件,其中我放入了一组设置为某个变量的文本,然后下一行将该变量回显到文本文件中。
问题在于它将所有内容回显到一条长行并且无法读取(它会强制您切换换行模式,但如果软件不支持它会怎样)。
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-string上发现了相同的问题和答案,该命令被称为fold
。 Windows的替代方案吗?
答案 0 :(得分: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!
答案 1 :(得分:2)
This is my version...
EDIT: I modified the code, so the split method is now isolated in a subroutine that may be called by any program.
The subroutine cut the string at a space previous to the maximum allowed length, and repeat this procedure as long as there is a remaining string.
@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