Невозможно распечатать выходные данные в окне powershell, которое будет использоваться для дальнейшего ввода на чтение-хост - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь получить вывод массива (который имеет имена и индексирование) на экране PS, чтобы пользователь мог выбирать из имеющихся у него опций для ввода в следующие шаги (Read-host). Добавляю индексирование (нумерацию индексов) к массиву. поэтому я могу вывести номер индекса и имя, которые могут быть использованы для ввода следующих шагов. Но выходные данные на экране не записываются и хранятся где-то на заднем плане и предоставляются вместе с моим оператором «return» для этой функции в самом конце сценария

Нужна помощь, чтобы вы, ребята, поняли, почему вывод не написано на экране powershell (как ISE, так и powershell 5.1)

function CLoneBranch
{
Param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0)][ValidateNotNullOrEmpty()]
[string]$url,
[Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=1)][ValidateNotNullOrEmpty()]
[String]$GitConnectionUserName,
[Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=2)][ValidateNotNullOrEmpty()]
[securestring]$GitConnectionUserPassword
)
try
{
    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($GitConnectionUserPassword)
    $plainpwd = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
    # Retrieve list of all repositories
    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $GitConnectionUserName,$plainpwd)))
    $headers = @{
        "Authorization" = ("Basic {0}" -f $base64AuthInfo)
        "Accept" = "application/json"}

    Add-Type -AssemblyName System.Web
    $gitcred = ("{0}:{1}" -f  [System.Web.HttpUtility]::UrlEncode($GitConnectionUserName),$plainpwd)

    $resp = Invoke-WebRequest -Headers $headers -Uri ("{0}/_apis/git/repositories?api-version=1.0" -f $url)
    $json = convertFrom-JSON $resp.Content
    If($resp)
    {
        [Array]$RepoArray = Add-IndexNumberToArray ($json.value)

        [int]$Selectedrepo = 0
        # use the current repo if there is only one repo available
        if ($RepoArray.Count -eq 1) 
        {
            $Selectedrepo = 1
        }
        while($Selectedrepo -gt $RepoArray.Count -or $Selectedrepo -lt 1)
        {

            Write-host "Please select a Repo from the list"
            $RepoArray | Select-Object IndexNumber , Name | Format-Table -verbose
**###### This is not written on the screen for user to look for what he has to input but some how at the end of function it returns the output using retun statement which I don't want ##########**

            try
            {
                $Selectedrepo = Read-Host "Please enter a selection from 1 to $($RepoArray.count)"
            }
            catch
            {
                Write-Warning -Message 'Invalid option, please try again.'
            }
        }
        if($($RepoArray[$Selectedrepo - 1].Name))
        {
            $RepoName = $($RepoArray[$Selectedrepo - 1].Name)
        }
        #write-verbose "You Selected Repo to download : $RepoName"
    }
}
       catch
 {
     Write-Error " Exception while cloning the repo or a specific branch"
     Write-Error $_.Exception.Message
     Write-Error " ErrorStack: $Error[0]"
     exit 1;
 }
 Return $RepoName
 }


function Add-IndexNumberToArray (
[Parameter(Mandatory=$True)]
[array]$array
)
{
for($i=0; $i -lt $array.Count; $i++) 
{ 
    Add-Member -InputObject $array[$i] -Name "IndexNumber" -Value ($i+1) -MemberType NoteProperty 
}
$array

}

1 Ответ

1 голос
/ 15 февраля 2020

Дистрибутив ваш код до минимального воспроизведения, мы получим следующее:

function Invoke-MyFunction
{
   write-host "here 1"
   @("aaa", "bbb") | format-table -Verbose
   write-host "here 2"
   return "ccc"
}

$x = Invoke-MyFunction
"---"
$x

, которое выдает:

here 1
here 2
---
aaa
bbb
ccc

Причина, по которой вы не видите вывод из @("aaa", "bbb") | format-table -Verbose между here 1 и here 2 на консоли указывается, что она возвращается из функции как часть выходного конвейера и присваивается $x, а не записывается на консоль внутри функции Invoke-MyFunction .

Как и большинство языков программирования, return PowerShell вернет значение и выйдет из функции, , но вы также можете передавать значения в «выходной конвейер», просто не записывая выражения в переменная. Например:

function Invoke-MultipleOutputs
{
    1
    "aaa"
    return "ccc"
}
$x = Invoke-MultipleOutputs
$x

$x будет содержать массив значений - в этом случае @( 1, "aaa", "ccc" ).

Это эквивалентно

function Invoke-MultipleOutputs
{
    Write-Output 1
    Write-Output "aaa"
    return "ccc"
}
$x = Invoke-MultipleOutputs
$x

В вашем код, вы делаете это: $RepoArray | Select-Object IndexNumber , Name | Format-Table -verbose, который преобразует $RepoArray в набор отформатированных табличных объектов, но затем, поскольку результатом является неназначенное выражение, оно записывается в выходной конвейер, а не выводится на консоль.

Чтобы это исправить, вам нужно отобразить вывод Format-Table в виде строки, а затем записать его в консоль, что вы можете сделать с помощью out-host ...

$RepoArray | Select-Object IndexNumber , Name | Format-Table -verbose | out-host

или out-string ...

$text = $RepoArray | Select-Object IndexNumber , Name | Format-Table -verbose | out-string
write-host $text

Возвращаясь к моему первому примеру, мы получим:

function Invoke-MyFunction
{
   write-host "here 1"
   @("aaa", "bbb") | format-table -Verbose | out-host
   write-host "here 2"
   return "ccc"
}

$x = Invoke-MyFunction
"---"
$x

, который теперь выдает:

here 1
aaa
bbb
here 2
---
ccc

Если вы обновите строку $RepoArray | ... таким же образом, как вы должны видеть, чтобы она отображалась на консоли там, где вы ожидаете.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...