在asp.net网站

时间:2017-04-07 16:48:18

标签: asp.net powershell azure-devops azure-devops-rest-api

我正在尝试运行一个powershell脚本并将其输出到我的asp.net站点。我使用了一个非常简单的脚本,其中脚本中的唯一命令是

Get-Service | Out-String

并将此输出到我的网站上我预期的一切

但是当我使用脚本时,我实际上希望它的信息不会输出任何内容 我可以告诉它运行(或运行),因为当我的网站点击调用脚本的代码时,它会挂起大约10秒钟。

我试图运行的脚本是

$user = "user"
$token = "token"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

$result = Invoke-WebRequest -Method Get -Uri 'https://site.vsrm.visualstudio.com/defaultcollection/product/_apis/release/releases?definitionId=1&api-version=3.0-preview.2&$expand=environments' -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

$releaseArr = $result.Content | ConvertFrom-Json
[System.Collections.ArrayList]$enviromentName = @()
[System.Collections.ArrayList]$latestRelease = @()


foreach($env in $releaseArr.value[0].environments)
{
    $enviromentName.Add($env.name) | Out-Null
}


foreach($releaseValue in $releaseArr.value)
{
    For($i = 0; $i -lt $enviromentName.Count; $i++)
    {
        if($latestRelease[$i] -eq $null)
        {
            foreach($release in $releaseValue.environments)
            {
                if($release.name -eq $enviromentName[$i] -and $release.status -eq "succeeded")
                {
                    $latestRelease.Add($releaseValue.name) | Out-Null
                }
            }
        }
    }
}

For($i = 0; $i -lt $enviromentName.Count; $i++)
{
    Write-Host $enviromentName[$i] " : " $latestRelease[$i]
}

我知道这个脚本会运行并输出,但是这个脚本中有一些代码会导致它无法正常输出。

我用来调用脚本的asp.net网站中的代码是

ResultBox.Text = string.Empty;

        // Initialize PowerShell engine
        var shell = PowerShell.Create();

        // Add the script to the PowerShell object
        shell.Commands.AddScript(@"C:\Users\user\Desktop\script.ps1");

        // Execute the script
        var results = shell.Invoke();

        // display results, with BaseObject converted to string
        // Note : use |out-string for console-like output
        if (results.Count > 0)
        {
            // We use a string builder ton create our result text
            var builder = new StringBuilder();

            foreach (var psObject in results)
            {
                // Convert the Base Object to a string and append it to the string builder.
                // Add \r\n for line breaks
                builder.Append(psObject.BaseObject.ToString() + "\r\n");
            }

            // Encode the string in HTML (prevent security issue with 'dangerous' caracters like < >
            ResultBox.Text = Server.HtmlEncode(builder.ToString());
        }

1 个答案:

答案 0 :(得分:1)

将“写入主机”更改为“写入输出”。 Write-Host仅输出到交互式控制台。

您可以看到这一点:

创建一个新的PowerShell文件并向其添加一个write-host语句:

[nick@nick-lt temp]$ New-Item -Type File -Path .\example.ps1 -Force
[nick@nick-lt temp]$ Set-Content .\example.ps1 "Write-Host 'Hello World'"

然后尝试将变量设置为脚本的结果:

[nick@nick-lt temp]$ $what = .\example.ps1
Hello World
[nick@nick-lt temp]$ $what
[nick@nick-lt temp]$

Hello World会在脚本执行时显示,但变量为空。

现在将其更改为写入输出:

[nick@nick-lt temp]$ Set-Content .\example.ps1 "Write-Output 'Hello World'"
[nick@nick-lt temp]$ $what = .\example.ps1
[nick@nick-lt temp]$ $what
Hello World

变量实际上包含了它现在的内容。

PowerShell的一个基本规则是不使用Write-Host,除非在脚本中以交互方式运行。 .NET需要输出流中的结果而不是主机流。