2016-10-17 32 views
0

私は異なる環境で動作するようになるpowershellスクリプトを作成しています。したがって、私は1つのメインスクリプトを持ち、必要な数の環境スクリプトを持つことができるように、環境ごとに別々の変数ファイルを作成しています。選択に基づいてpowershellで変数を動的にロードする方法

私は二つのファイル

ENV-CI.ps1 ENV-QA.ps1

の両方を持つ動的テスト目的のために、私の固有の環境ファイル

をロードするためのPowerShellを得ることができなかったがファイルには、それぞれ1つの変数 [string] $ envName = "CI" と [string] $ envName = "QA"のみが含まれています。

私はどの環境で作業するのかを指定するためにpromptForChoiceを使用していますが、読み込むスクリプトを取得できません。

私はドットについて読んだことがあるが、これはこれは私のスクリプトファイルエラーがスローされません

function whatEnvironment { 
    [string] $answer = "" 
    [string] $title = "" 
    [string] $message = "What environment are you updating" 

    $ci = New-Object System.Management.Automation.Host.ChoiceDescription "&CI", ` 
     "Update the CI environment." 

    $qa = New-Object System.Management.Automation.Host.ChoiceDescription "&QA", ` 
     "Update the QA Environment." 

    $uat = New-Object System.Management.Automation.Host.ChoiceDescription "&UAT", ` 
     "Update the UAT environment." 

    $production = New-Object System.Management.Automation.Host.ChoiceDescription "&Production", ` 
     "Update the Production Environment." 
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($ci, $qa, $uat, $production) 

    :OuterLoop do 
     { 
      $answer = $host.ui.PromptForChoice($title, $message, $options, -1) 

      switch ($answer) 
       { 
        0 { 
         . .\environment-CI.ps1 
         break OuterLoop 
         } 
        1 { 
         . .\environment-QA.ps1 
         break OuterLoop 
         } 
        2 {break OuterLoop} 
        3 {break OuterLoop} 
       } 
     } 
    while ($y -ne 100) 
    return $answer 
} 

cls 
$environment = whatEnvironment 
write-host $environment 
write-host $envName 

あるファイル

をロードするためには表示されませんが、環境変数を含むファイルがロードされていません。

+0

これは単なるスコープの問題であると確信しています。変数は、それらのソースをドットする関数内でのみ有効です。 '[string] $ Global:envName =" CI "' – whatever

+0

私はglobal:を使用しています。これは動作します。私が気になることの1つは、スクリプト実行後もグローバル・ステイとして定義された変数です。したがって、グローバルに物事を置くと、私は緊張し、利用可能なら他のものを好むでしょう。 –

+0

Ansgardsの答えは間違いなく、これについてもっと良い方法です: '[string] $ Script:envName =" CI "'を使ってみてください。また、スクリプトが実行された後に変数を残さないようにすることもできます。あなたは今すぐそれを試すことができません。 – whatever

答えて

1

一度に1つのことを行います。ループやものから奇妙なものを壊すことはありません。最初にユーザーの決定を促してから、ユーザーが有効な選択を行った後にの後に環境ファイルをロードします。

function whatEnvironment { 
    [string] $answer = "" 
    [string] $title = "" 
    [string] $message = "What environment are you updating" 

    $ci = New-Object Management.Automation.Host.ChoiceDescription "&CI", "Update the CI environment." 
    $qa = New-Object Management.Automation.Host.ChoiceDescription "&QA", "Update the QA Environment." 
    $uat = New-Object Management.Automation.Host.ChoiceDescription "&UAT", "Update the UAT environment." 
    $production = New-Object Management.Automation.Host.ChoiceDescription "&Production", "Update the Production Environment." 

    $options = [Management.Automation.Host.ChoiceDescription[]]($ci, $qa, $uat, $production) 

    do { 
     $answer = $Host.UI.PromptForChoice($title, $message, $options, -1) 
    } until ($answer -in 1..4) 

    switch ($answer) { 
     0 { ". .\environment-CI.ps1" } 
     1 { ". .\environment-QA.ps1" } 
    } 

    return $answer 
} 

$environment = whatEnvironment 
Write-Host $environment 
関連する問題