PowerShell数组的第一个元素是" true"?

时间:2014-10-30 22:06:29

标签: powershell

arg1我有一些代码可以创建一个空的PowerShell数组,然后在do..while循环中将项添加到这个数组中。出于某种原因,无论我做什么,数组中的第一个元素是" true"。为什么是这样?

在下面的代码中,您会注意到循环一次从外部exe添加一行。 exe永远不会返回" true",你可以看到我为每个添加到数组中的它做了Write-Host,并且从来没有" true&# 34;此写主机调用的输出。我的脚本中没有任何其他代码可以向数组添加任何元素。这很令人沮丧,因为数组的索引搞砸了。这实质上使这个数组1索引而不是0索引。有没有人对这里发生的事情有任何想法?

另外,还有一件事需要注意,在我初始化数组后,我写了主持人的长度,而且它是0,然后在我不添加所有项目之后,长度就是我想要的期待它是真的"真的"不是第一个元素。因此,如果从外部应用程序返回4行,则第二个Write-Host $ output.Length调用将输出4.

这是我的代码:

$output = @()
Write-Host "OUTPUT LENGTH START: $($output.Length)" -ForegroundColor Yellow
$continue = $true
do {
    $tempoutput = $Process.StandardOutput.ReadLine()
    if(($tempoutput -ne $null) -and ([string]::IsNullOrWhiteSpace($tempoutput) -ne $true)) {
        Write-Host $tempoutput -ForegroundColor DarkGray
        $output += $tempoutput
    } else {
        $continue = $false
    }
}
while($continue -eq $true)
Write-Host "OUTPUT LENGTH END: $($output.Length)" -ForegroundColor Yellow

此外,在我的函数结束时,我将返回输出数组:

$output

然后在我的代码中调用我的函数,如果我对返回的数组元素进行预测," True"将始终是此数组中的第一个项目。

编辑包含全部功能 这是我的全部功能,删除了所有Write-Host调用:

function Execute-HttpManager($arguments, $filepath){
    $ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo 
    $ProcessInfo.FileName = $filepath 
    $ProcessInfo.RedirectStandardError = $true 
    $ProcessInfo.RedirectStandardOutput = $true 
    $ProcessInfo.RedirectStandardInput = $true
    $ProcessInfo.UseShellExecute = $false 
    $ProcessInfo.CreateNoWindow = $true
    $ProcessInfo.Arguments = $arguments
    $Process = New-Object System.Diagnostics.Process 
    $Process.StartInfo = $ProcessInfo

    $Process.Start() 
    $Process.WaitForExit() 

    $output = @()
    $continue = $true
    do {
        $tempoutput = $Process.StandardOutput.ReadLine()
        if(($tempoutput -ne $null) -and ([string]::IsNullOrWhiteSpace($tempoutput) -ne $true)) {
            $output += $tempoutput
        } else {
            $continue = $false
        }
    }
    while($continue -eq $true)

    $deployError = $Process.StandardError.ReadToEnd()

    $exitcode = $Process.ExitCode

    if($exitcode -eq 4) {
        $deployagainresponse = Read-Host
        if($deployagainresponse -eq 'y') {
            Deploy-Database $localapp $localsqlinstance $localdatabasename $localbackup $localsnapshot
        } elseif($deployagainresponse -ne 'bypass') {
            throw "http interaction failed with error.  Check the output."
        }
    } elseif ($exitcode -ne 0) {
        throw "Database deploy failed."
    }

    return $output
}

以下是调用我的函数的代码:

$tokenoutput = Execute-HttpManager @("arg1", "arg2", "arg3", "arg4") $pathtoexecutable  

这个$ tokenoutput变量具有" True"添加到它的数组的开头。

1 个答案:

答案 0 :(得分:0)

确保检查是否有任何返回值的调用(例如$Process.Start()),并在它们前面加[void]或管道为out-null:$Process.Start() | Out-Null

任何功能都要注意这一点!函数输出的任何内容都是返回值的一部分。