2017-04-07 4 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을 사용하여 웹 사이트에서 API를 호출하는 이유는 무엇입니까? 응용 프로그램에서 직접 REST 메서드를 호출 할 수 있습니다. –

+0

이미이 스크립트를 만들었으므로 기존 스크립트를 다시 만들지 않고 기존 스크립트를 사용할 수있는 방법을 찾고있었습니다 – Nick

+0

이 패키지를 고려해 볼 것을 권장합니다 https://www.nuget.org/packages/Microsoft.VisualStudio.Services 클라이언트./쉽지. –

답변

0

변경 "쓰기 호스트"할 수있다 "쓰기 출력을." 쓰기 - 대화 형 콘솔에 호스트 출력 만 허용합니다.

새로운 PowerShell을 파일을 만들고 이것을 쓰기 호스트 문을 추가 :

당신은 행동에서 볼 수

다음
[[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의 기본 규칙 중 하나는 대화 형으로 실행되는 스크립트를 제외하고 Write-Host를 사용하지 않는 것입니다. .NET은 호스트 스트림이 아닌 출력 스트림에서 결과를 필요로합니다.