отступ PowerShell - PullRequest
       3

отступ PowerShell

9 голосов
/ 30 июня 2011

Я пишу большой скрипт, который развертывает приложение. Этот скрипт основан на нескольких вызовах вложенных функций.

Есть ли способ "идентифицировать" вывод по глубине?

Например, у меня есть:

function myFn()
{
    Write-Host "Start of myfn"
    myFnNested()
    Write-Host "End of myfn"
}
function myFnNested()
{
    Write-Host "Start of myFnNested"
    Write-Host "End of myFnNested"
}

Write-Host "Start of myscript"
Write-Host "End of myscript"

Вывод скрипта будет:

Start of myscript
Start of myfn
Start of myfnNested
End of myFnNested
End of myFn
End of myscript

Чего я хочу добиться, так это вывода:

Start of myscript
  Start of myfn
    Start of myfnNested
    End of myFnNested
  End of myFn
End of myscript

Поскольку я не хочу едва кодировать количество пробелов (так как я не знаю уровень глубины в сложном сценарии). Как я могу просто достичь своей цели?

Может быть как то так?

function myFn()
{
    Indent()
    Write-Host "Start of myfn"
    myFnNested()
    Write-Host "End of myfn"
    UnIndent()
}
function myFnNested()
{
    Indent()
    Write-Host "Start of myFnNested"
    Write-Host "End of myFnNested"
    UnIndent()
}

Write-Host "Start of myscript"
Write-Host "End of myscript"

Ответы [ 6 ]

6 голосов
/ 30 июня 2011

Вы можете использовать функцию-оболочку около write-host, которая использует $MyInvocation для определения глубины стека, чтобы создать количество пробелов для префикса сообщения.

Объедините это с параметром -scope ‹n› Get-Variable, чтобы получить каждый вызывающий уровень & hellip; что-то вроде showstack функции, адаптированной из Windows PowerShell In Action (Payette, 1 st Ed):

function ShowStack {
  trap { continue; }
  0..100 | Foreach-Object {
    (Get-Variable -scope $_ 'MyInvocation').Value.PositionMessage -replace "`n"
  }
}

Вам понадобится максимальное значение $_ в конвейере до того, как Get-Variable завершится сбоем, если количество областей слишком велико.

4 голосов
/ 29 апреля 2012

Проверьте этот скрипт http://poshcode.org/scripts/3386.html

Если вы загрузите эту упаковку Write-Verbose, вы можете установить $WriteHostAutoIndent = $true, а затем просто вызвать Write-Host, и он будет иметь отступ с учетом глубины стека. Итак, учитывая эти функции, как вы их определили изначально:

function myFn()
{
   Write-Host "Start of myfn"
   myFnNested
   Write-Host "End of myfn"
}
function myFnNested()
{
   Write-Host "Start of myFnNested"
   Write-Host "End of myFnNested"
}

Без изменений вы можете просто поставить исходный текст файла сценария с этой функцией-оболочкой Write-Host:

C:\PS> . C:\Users\Jaykul\Documents\WindowsPowerShell\PoshCode\3386.ps1

А затем просто установите переменную предпочтения перед вызовом вашей функции:

C:\PS> $WriteHostAutoIndent = $true
C:\PS> myFn
  Start of myfn
    Start of myFnNested
    End of myFnNested
  End of myfn

Прекрасный отступ с выводом, как волшебство; -)

1 голос
/ 07 августа 2012

Я использовал другую линию мышления.Я установил переменную count, которая увеличивается в начале функции, а затем использовал следующий код для заполнения строки, которую я писал:

write-host ($string).PadLeft( ($string).length + (2 * $count) )

Это позволит сделать отступ в два пробела для каждой рекурсии.

0 голосов
/ 15 июля 2016

Вы можете переопределить Write-Host, чтобы написать свои отступы перед вызовом оригинала с помощью оператора '&' и пространства имен. Возможно, вы сможете получить величину отступа из текущей области стека, но глобальная переменная дает вам больше контроля.

$global:writeHostIndent

function Write-Host
{
    Microsoft.PowerShell.Utility\Write-Host (' ' * $global:writeHostIndent) -NoNewline
    & 'Microsoft.PowerShell.Utility\Write-Host' $args
}
0 голосов
/ 30 июня 2011

Написать функцию отладки.Два аргумента, один из которых - флаг, который принимает Start, Stop или Note;другим аргументом должен быть текст отладки.(Я бы использовал 1, -1 и 0 для флага, затем вы можете просто добавить флаг в переменную Indent для установки глубины приращения. Глупо, но достаточно для отладки.)

0 голосов
/ 30 июня 2011

Вы можете использовать Console.CursorLeft, чтобы установить свою позицию.Имейте в виду, что запись-вывод будет сбрасывать любое пользовательское местоположение, поэтому вам нужно сбрасывать его после каждого выхода.Вот пример:

    $i = 0
    function Indent() {
        [console]::CursorLeft += 2
        $i = [console]::CursorLeft
        $i
    }

    function UnIndent() {
        if($i -gt 0) { $i -= 2 }
        [console]::CursorLeft = $i
        $i
    }

    function WriteIndent([string]$s) {
        [console]::CursorLeft += $i
        write-host $s
        # Reset indent, as write-host will set cursor to indent 0
        [console]::CursorLeft += $i
    }

    function myFnNested() {     
      $i = Indent     
      WriteIndent "Start of myFnNested"     
      WriteIndent "End of myFnNested"     
      $i = UnIndent 
    }

    function myFn() {     
      $i = Indent   
      WriteIndent "Start of myfn"     
      myFnNested
      WriteIndent "End of myfn"     
      $i = UnIndent 
    } 

    WriteIndent "Start of myscript"
    myFn
    WriteIndent "End of myscript"

Выход:

    PS C:\scripting> .\Indent-Output.ps1
    Start of myscript
        Start of myfn
            Start of myFnNested
            End of myFnNested
        End of myfn 
    End of myscript
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...