【问题标题】:printing a paragraph in windows batch在 Windows 批处理中打印一个段落
【发布时间】:2013-01-28 10:16:04
【问题描述】:

以下代码可以很好地打印段落

@echo off
setlocal disableDelayedExpansion
set "skip="
for /f "delims=:" %%N in (
  'findstr /x /n ":::BeginText" "%~f0"'
) do if not defined skip set skip=%%N
>test.txt (
  for /f "skip=%skip% tokens=*" %%A in (
   'findstr /n "^" "%~f0"'
  ) do (
    set "line=%%A"
    setlocal enableDelayedExpansion
    echo(!line:*:=!
    endlocal
  )
)
type test.txt
exit /b

:::BeginText
This text will be exactly preserved with the following limitations:

  1) Each line will be terminated by CR LF even if original has only LF.

  2) Lines are limited in length to approximately 8191 bytes.

Special characters like ^ & < > | etc. do not cause a problem.
Empty lines are preserved!
;Lines beginning with ; are preserved.
:::Leading : are preserved

有没有办法添加像:::Endtext 这样的文本标记,以便只有段落之间 :::BeginText:::Endtext 被打印出来。

【问题讨论】:

  • 这一行开头括号的作用是什么:echo(!line:*:=!?
  • @utapyngo: !line:*:=! 遵循以下语法:!varname:substr1=substr2!,因此varname 中每次出现的substr1 都将替换为substr2。在您的特定示例中,substr1 包含一个掩码(* 代表任意数量的任意字符),substr2 为空,这意味着匹配的子字符串将被简单地删除。
  • @AndriyM:我知道。我在echo 之后询问左括号。我试图删除它,但没有它就无法工作。
  • @utapyngo:啊,是的,对不起,你说得很清楚,我忽略它是愚蠢的。这是为了防止例如当表达式计算为空字符串时,ECHO is OFF 消息。至于为什么(而不是别的什么,请看this answer

标签: windows batch-file


【解决方案1】:

当然:-)

您可以在脚本中嵌入多个命名段落,并通过为每个段落使用唯一标签来选择性地编写它们。

只要 GOTO 和/或 EXIT /B 阻止文本被执行,命名文本就可以出现在脚本中的任何位置。

为方便起见,下面的脚本将逻辑封装在:printParagraph 例程中。

@echo off
setlocal disableDelayedExpansion
goto :start

:::BeginText1
Paragraph 1
  is preserved

Bye!
:::EndText

:start
echo Print paragraph 1 directly to screen
echo ------------------------------------------
call :printParagraph 1
echo ------------------------------------------
echo(
echo(

call :printParagraph 2 >test.txt
echo Write paragraph 2 to a file and type file
echo ------------------------------------------
type test.txt
echo ------------------------------------------
echo(
echo(

echo Print paragraph 3 directly to screen
echo ------------------------------------------
call :printParagraph 3
echo ------------------------------------------
echo(
echo(

exit /b

:::BeginText2
This is paragraph 2

Pure poetry
:::EndText

:printParagraph
set "skip="
for /f "delims=:" %%N in (
  'findstr /x /n ":::BeginText%~1" "%~f0"'
) do if not defined skip set skip=%%N
set "end="
for /f "delims=:" %%N in (
  'findstr /x /n ":::EndText" "%~f0"'
) do if %%N gtr %skip% if not defined end set end=%%N
for /f "skip=%skip% tokens=*" %%A in (
 'findstr /n "^" "%~f0"'
) do (
  for /f "delims=:" %%N in ("%%A") do if %%N geq %end% exit /b
  set "line=%%A"
  setlocal enableDelayedExpansion
  echo(!line:*:=!
  endlocal
)
exit /b

:::BeginText3
One more...

  ...for good measure
:::EndText

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多