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"添加到它的数组的开头。
答案 0 :(得分:0)
确保检查是否有任何返回值的调用(例如$Process.Start()
),并在它们前面加[void]
或管道为out-null:$Process.Start() | Out-Null
。
任何功能都要注意这一点!函数输出的任何内容都是返回值的一部分。