【问题标题】:Echo a long string with specified start column for new lines为新行回显具有指定起始列的长字符串
【发布时间】:2014-07-24 08:19:27
【问题描述】:

我正在编写一个小型控制台应用程序。当通过 -h 时,此应用程序应打印帮助。这就是我想要得到的:

Program that prints help.
Usage:
  prg [OPTIONS]

Options:
  -h - print help.
  -x - some very very very very very very very very very very very very very very
       very very very very long parameter description.
  -y - another  very very very very very very very very very very very very very
       very very very very long parameter description.

我正在使用echo. -x - {long description here} 打印参数说明。当然,当字符串太长时,它会像这样打印:

           -x - some very very very very very very very very very very very very
very very very very long parameter description.

所以问题是如何打印一个长字符串并指定左边框?

【问题讨论】:

  • 您知道可用于显示您的字符串的列数吗?
  • 不,我不知道。这就是我问这个问题的原因。

标签: windows batch-file cmd echo


【解决方案1】:
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION 
for /f %%I in ('powershell ^(Get-Host^).UI.RawUI.WindowSize.width') do set width=%%I
SET "spaces= "
:splp
IF "!spaces:~%width%!"=="" SET spaces=%spaces%%spaces%&GOTO splp

CALL :display 0 "Program that prints help."
CALL :display 0 "Usage:"
CALL :display 2 "prg [OPTIONS]"
CALL :display 0
CALL :display 0 "Options:"
CALL :display 2 "-x" 5 "- some very very very very very very very very very very very very very very very very very very long parameter description."
CALL :display 2 "-y" 5 "- another  very very very very very very very very very very very very very very very very very long parameter description."

GOTO :EOF

:display
SET "remainder="
SET "line=!spaces:~0,%1!"
IF "%~2"=="" GOTO write
IF "%3"=="" SET "line=%line%%~2"&GOTO write
SET /a indent=%1+%3
SET "remainder=%~2%spaces%"
SET "line=%line%!remainder:~0,%3!
SET "remainder=%~4"
:remainlp
SET /a eol=width-indent-1
:seteollp
SET "eolchar=!remainder:~%eol%,1!"
IF NOT DEFINED eolchar SET "line=%line%%remainder%"&set "remainder="&goto write
IF NOT "%eolchar%"==" " set /a eol-=1&GOTO seteollp
SET "line=%line%!remainder:~0,%eol%!
SET /a eol+=1
set "remainder=!remainder:~%eol%!"
:write
ECHO(%line%
IF NOT DEFINED remainder GOTO :EOF
SET "line=!spaces:~0,%indent%!"
GOTO remainlp

我不会声称神奇的 powershell 系列没有独创性 - 它来自 Rojo's response here

【讨论】:

  • 花了大约半个小时来了解这个脚本是如何工作的。但这绝对是我想要的。我唯一的问题是运行 powershell 字符串有什么要求吗?我的意思是它可以在任何 Windows 机器上运行吗?
  • AFAIAA,它应该可以在任何可以执行 powershell 的机器上运行。
【解决方案2】:

您是否尝试过使用标签?

例如:

echo.^     -x - some very very very very very very very very very very
echo.^  ^   very very very very very very very 
echo.^  ^   very long parameter description.

我使用了“^”字符来显示选项卡的位置,并且不得不将消息分成几行以停止自动换行。

这是我刚刚尝试过的脚本(选项 x 使用制表符而选项 y 不使用)

@echo OFF

echo.   Usage:
echo.       prg [OPTIONS]
echo.
echo.   Options:
echo.     -h - print help.
echo.      -x - some very very very very very very very very very very
echo.       very very very very very very very 
echo.       very long parameter description.
echo.      -y - another  very very very very very very very very very very very very very
echo.            very very very very long parameter description.

我得到以下输出(选项 x 使用制表符而选项 y 不使用)

C:\Temp>usage.bat
        Usage:
                prg [OPTIONS]

        Options:
          -h - print help.
           -x - some very very very very very very very very very very
                very very very very very very very
                very long parameter description.
           -y - another  very very very very very very very very very very very
very very
                 very very very very long parameter description.

【讨论】:

  • 是的,我在每个echo 语句中都使用了制表符。但是如果用户将使用自定义窗口宽度怎么办。例如,尝试在mode con:cols=40 之后运行您的脚本。顺便说一句,当使用echo.(带点)时,我认为不需要^ 符号来转义制表符。
  • 你的权利它只会在标准的 80 列提示中真正起作用。我想您可以查询列数并相应地显示不同的使用消息,但这会导致大量重复。
    在脚本开始时强制控制台窗口为 80 列怎么样。
    在我的回答中,我只是使用“^”字符来说明我将标签放在哪里:)
【解决方案3】:
echo off
setlocal enabledelayedexpansion

set "textx=some very very very very very very very very very very very very very very very very very very long parameter description."

REM find screen widht (subtract 8 for a leading tab and two for a right "border" :
for /f "tokens=2 delims=: " %%i in ('mode^|find "Columns"') do set /a colums=%%i-10

call :wrap "-x" "%textx%"
call :wrap "-y" "another quite quite quite quite quite quite quite quite quite quite quite quite quite quite quite quite quite long parameter description."

exit /b

:wrap <option> <text>
 set "text=%~2"
 set /p ".=%~1"<nul
 for /l %%i in (0,%colums%,1000) do echo.   !text:~%%i,%colums%!|findstr ".."
goto :eof

注意:echo. 和 !text.... 之间有一个

您可能需要将find "Columns" 中的Columns 替换为正确的字符串(取决于语言)

我从屏幕宽度中减去 10:8 表示前导,两个表示在窗口结束前两个字符结束行。

1000 是字符串的最大长度。根据需要进行调整。 (数值越高,输出越慢)

|findstr ".." 抑制空行的输出

这有一些缺点:

-x前面没有空格(set不支持)

即使它位于单词的中间,它也会在行尾换行。可以进行“自动换行”,但需要更多代码。

特殊字符有问题(例如&amp;、!、|)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2013-09-10
    • 2020-07-31
    相关资源
    最近更新 更多