参数化的控制台字符定位

时间:2019-04-23 01:10:39

标签: .net powershell

我不确定如何在我用来写到控制台的功能中动态调整字符,除了可以从“格式表”获得的动态可伸缩性之外,控制台还需要严格的位置,但是我希望做一些不同的事情,这样我就可以摆脱需要文件的麻烦了。

我在列表中放入了第二项,仅供参考,以查看问题的背景,我找到了一种使用此方法绘制整个数组或从哈希表中提取数据的方法,但我试图找到不需要那么多预定义字符列表等的方法。例如,两个$ top和$ bot数组,我知道可以通过列出的一些建议来完成...只是没有确定如何正确显示格式中的单词,如果字符超过某个阈值,则它会带有尾随点,就像format-table那样...这是上下文。完全符合我的实际代码。

function Wrap-Top {[CmdLetBinding()]Param()                                                                                                                                
$top=@([PSCustomObject]@(                                                                             
"                                                                                            ";
" //-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_\\ ";
" \\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ";
" //                                                                                      \\ ";));                                                                                           
Write-Output $top;}; 

function Wrap-Bot {[CmdLetBinding()]Param()
$bot=@([PSCustomObject]@(
" //                                                                                      \\ ";
" \\ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// ";
" //_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\\ ";
"";));
Write-Output $bot;};

Function Wrap-Action {[CmdletBinding()]Param(
[Parameter(Position=0,Mandatory,ValueFromPipeline=$True)][Alias("#")][String]$Type)
[Parameter(Position=1,Mandatory,ValueFromPipeline=$True)][Alias("@")][String]$Description)
Begin{Wrap-Top}
Process{(Write-Output " \\ [ $($Text) ] @: )(Write-Output "$($Description)" }
End{Wrap-Bot}}

Wrap-Action -Type "Item1" -Description "$($i.0)"

"                                                                                            ";
" //-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_\\ ";
" \\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ";
" //                                                                                      \\ ";
" \\                                                                                      // ";
" //             Item1 : $($i.0)";
" \\             Item2 : $($i.1)";                                                                                    
" //                                                                                      // ";
" \\                                                                                      \\ ";
" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// ";
" \\_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\\ ";
"";));

2 个答案:

答案 0 :(得分:0)

这是进行居中的一种方法。 [咧嘴]我相信有更简单,更直接的方法……但是我暂时还没有想到。 [脸红]

如果决定使用此功能,我建议您将其转换为可以由需要它的代码部分正常调用的函数。

我个人的看法是,这是...大量的时间浪费。每次屏幕写操作都会减慢脚本速度,因此通常值得花些时间来减少屏幕写操作的数量,而不是增加

# fake reading in a text file
#    in real life, use Get-Content
$StatusItemList = @'
One
TwoIsTheNumberOfThisItem
Ee-Thray
ForForeFour
Five_ThisGoesOutToColumn26
Six
'@ -split [environment]::NewLine

$StartTB_Line = '//'
$EndTB_Line = '\\'
$FillerTB_Line = '-'
$StandardWidth = 20
$StartStatusLine = $EndTB_Line
$EndStatusLine = $StartTB_Line


foreach ($SIL_Item in $StatusItemList)
    {
    $SL_Text = '[ Processing : {0} ]' -f $SIL_Item
    if ($SL_Text.Length -gt ($StandardWidth - 2))
        {
        $Width = $SL_Text.Length + 2
        }
        else
        {
        $Width = $SL_Text.Length
        }
    $Padding = [int](($Width - $SL_Text.Length) / 2)
    $Centered = -join @((' ' * $Padding), $SL_Text, (' ' * $Padding))

    $TB_Line = -join @($StartTB_Line, ($FillerTB_Line * $Width), $EndTB_Line)
    $S_Line = -join @($StartStatusLine, $Centered, $EndStatusLine)

    $TB_Line
    $S_Line
    $TB_Line
    ''
    }

输出...

//----------------------\\
\\ [ Processing : One ] //
//----------------------\\

//-------------------------------------------\\
\\ [ Processing : TwoIsTheNumberOfThisItem ] //
//-------------------------------------------\\

//---------------------------\\
\\ [ Processing : Ee-Thray ] //
//---------------------------\\

//------------------------------\\
\\ [ Processing : ForForeFour ] //
//------------------------------\\

//---------------------------------------------\\
\\ [ Processing : Five_ThisGoesOutToColumn26 ] //
//---------------------------------------------\\

//----------------------\\
\\ [ Processing : Six ] //
//----------------------\\

答案 1 :(得分:0)

为保持空格破折号模式,以下脚本补偿了奇数$Text.Length

## Q:\Test\2019\04\23\SO_55802986.ps1
Function Wrap-Status ($Text){
    $PadEven = $Text.Length % 2 # pad to even length
    $Pad = [math]::Max(10,$Text.Length+$PadEven)

    '// - - - - - - - - - {0}\\'    -f        ('- '*($Pad/2))
    '\\ [ Processing : {0} ]{1} //' -f  $Text,(' '*($Pad-$Text.Length))
    '// - - - - - - - - - {0}\\'    -f        ('- '*($Pad/2))
    ''
}

$Array = 'this','55555','88888888','999999999','1010101010','11111111111',
         '14141414141414','151515151515151','Five_ThisGoesOutToColumn26'

ForEach ($Text in $Array){Wrap-Status $Text}

示例输出:

> Q:\Test\2019\04\23\SO_55802986.ps1
// - - - - - - - - - - - - - - \\
\\ [ Processing : this ]       //
// - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - \\
\\ [ Processing : 55555 ]      //
// - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - \\
\\ [ Processing : 88888888 ]   //
// - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - \\
\\ [ Processing : 999999999 ]  //
// - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - \\
\\ [ Processing : 1010101010 ] //
// - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - - \\
\\ [ Processing : 11111111111 ]  //
// - - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - - - \\
\\ [ Processing : 14141414141414 ] //
// - - - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - - - - \\
\\ [ Processing : 151515151515151 ]  //
// - - - - - - - - - - - - - - - - - \\

// - - - - - - - - - - - - - - - - - - - - - - \\
\\ [ Processing : Five_ThisGoesOutToColumn26 ] //
// - - - - - - - - - - - - - - - - - - - - - - \\