2017-04-07 78 views
1

私はpowershellスクリプトを実行して、asp.netサイトに出力しています。私はそれが私が asp.netサイトでpowershellスクリプトを実行しています

を期待しますが、私は、スクリプトを使用するときに、私は実際に情報が欲しい私のサイトのすべてにスクリプト内のコマンドだけが

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

PowerShellを使用してWebサイトからAPIを呼び出すのはなぜですか?アプリケーション内で直接RESTメソッドを呼び出すことができます。 –

+0

すでにこのスクリプトが作成されており、既存のスクリプトを再作成する代わりに使用する方法を探していました – Nick

+0

このパッケージについては、https://www.nuget.org/packages/Microsoft.VisualStudio.Services .Release.Client /、それは簡単です。 –

答えて

0

変更「ライト・ホスト」にある「ライト・アウトプットを。」書き込み - 対話型コンソールへの出力のみをホストします。

が新しいPowerShellのファイルを作成し、それへの書き込み-host文を追加します:

あなたはこの動作を確認することができます

その後
[[email protected] temp]$ New-Item -Type File -Path .\example.ps1 -Force 
[[email protected] temp]$ Set-Content .\example.ps1 "Write-Host 'Hello World'" 

しようとすると、スクリプトの結果に変数を設定します。

[[email protected] temp]$ $what = .\example.ps1 
Hello World 
[[email protected] temp]$ $what 
[[email protected] temp]$ 

Hello Worldは、スクリプトの実行時に表示されますが、変数は空です。

今書き込み出力をするように変更します。

[[email protected] temp]$ Set-Content .\example.ps1 "Write-Output 'Hello World'" 
[[email protected] temp]$ $what = .\example.ps1 
[[email protected] temp]$ $what 
Hello World 

変数が実際にそれが今になっているものが含まれています。

PowerShellの基本ルールの1つは、対話形式で実行されるスクリプト以外のWrite-Hostを使用しないことです。 .NETでは、ホストストリームではなく出力ストリームに結果が必要です。

関連する問題