2016-07-11 62 views
0

2つのPowerShellスクリプトがあります。 1つのスクリプト(omreg.ps1)には、Windowsレジストリ内のいくつかのものをチェックしていくつかの値を返す関数が含まれています。もう一方のスクリプト(test.ps1)はomreg.ps1を参照して関数を呼び出し、omreg.ps1の変数から値を取得しようとします。 omreg.ps1の変数は関数自体の中で正しい値を返しますが、値はtest.ps1に正しく渡されません。私は似たようなことをする他の多くの関数を持っており、これらの関数の変数値を別のPowerShellスクリプトに渡すことに問題はありません。なぜ私はこの特定の関数で問題が発生しているのか分かりません。どんな助けもありがとう。PowerShell:スクリプト間で変数の値を渡す方法

omgreg.ps1:

Function CheckOMRegistry 
{ 
    [int]$OMCodeBaseValueFail = 0 
    [int]$OMRegPathFail = 0 
    [string]$BuildNumber = GC 'E:\buildnumber.txt' 
    New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT 
    [string]$OMGuid = '{E9E7xxxx-6Dxx-49xx-91xx-B919DD45xxxx}' 
    [string]$OMRegPath = ('HKCR:\CLSID\' + $OMGuid + '\InprocServer32') 

    $OMRegPathExists = Test-Path $OMRegPath 
    If ($OMRegPathExists) 
    { 
     Write-Host "OMRegPath Exists" 
     Write-Host "Check CodeBase value ..." 
     $OMCodeBaseValue = Get-ItemProperty -Path $OMRegPath -Name 'CodeBase' | Select -Exp 'CodeBase' 
     Write-Host "OMCodeBaseValue: $OMCodeBaseValue" 
     If ($OMCodeBaseValue.Contains($BuildNumber)) 
     { 
      Write-Host "OM CodeBase Value is Correct" -fore yellow 
     } 
     Else 
     { 
      Write-Host "OM CodeBase Value in INCORRECT!" -fore red 
      $OMCodeBaseValueFail += 1 
     } 
    } 
    Else 
    { 
     Write-Host "OMRegPath DOES NOT EXIST!" -fore red 
     $OMRegPathFail += 1 
    } 

    $OMCodeBaseValueFail 
    $OMRegPathFail 
    $OMRegPath 
    $OMCodeBaseValue 

    Write-Host 
    Write-Host "OMCodeBaseValueFail : $OMCodeBaseValueFail" 
    Write-Host "OMRegPathFail : $OMRegPathFail" 
    Write-Host "OMRegPath : $OMRegPath" 
    Write-Host "OMCodeBaseValue : $OMCodeBaseValue" 
} 

そして、ここでは(私が期待するもの)返された値です。ここで

OMCodeBaseValueFail : 0 
OMRegPathFail : 0 
OMRegPath : HKCR:\CLSID\{E9E7xxxx-6Dxx-49xx-91xx-B919DD45xxxx}\InprocServer32 
OMCodeBaseValue : file:///E:/<buildnumber>/Release/someproduct.dll 

は、2番目のスクリプトです。

test.ps1:

. $pwd\omreg.ps1 
$OMCodeBaseValueFail, $OMRegPathFail, $OMRegPath, $OMCodeBaseValue = CheckOMRegistry 

Write-Host 
Write-Host "OMCodeBaseValueFail : $OMCodeBaseValueFail" 
Write-Host "OMRegPathFail : $OMRegPathFail" 
Write-Host "OMRegPath : $OMRegPath" 
Write-Host "OMCodeBaseValue : $OMCodeBaseValue" 

そして、ここでは値がtest.ps1で返さなっているかである(ない私は何を期待、上記と同じでなければなりません):

OMCodeBaseValueFail : HKCR 
OMRegPathFail : 0 
OMRegPath : 0 
OMCodeBaseValue : HKCR:\CLSID\{E9E7xxxx-6Dxx-49xx-91xx-B919DD45xxxx}\InprocServer32 file:///E:/<buildnumber>/Release/someproduct.dll 
+0

'New-PSDrive ...' - > 'New-PSDrive ... | Out-Null' – PetSerAl

+0

あなたは天才です!ありがとうございました。 – Keith

答えて

0

あなたの最初の機能はコンソールホストへの書き込みで、出力ストリームへの書き込みは行いません。私は、あなたが応答が中に戻ったが、基本的に、あなたはへの最初の関数の出力を持っている必要があり

Write-Host "OMCodeBaseValueFail : $OMCodeBaseValueFail" 
Write-Host "OMRegPathFail : $OMRegPathFail" 
Write-Host "OMRegPath : $OMRegPath" 
Write-Host "OMCodeBaseValue : $OMCodeBaseValue" 

Write-Output $OMCodeBaseValueFail 
Write-Output $OMRegPathFail 
Write-Output $OMRegPath 
Write-Output $OMCodeBaseValue 

を変更、文字列だけでキャプチャする必要はありません正確にどのような形式パイプラインではなく、コンソールホストです。私はカスタムオブジェクトを作成し、そのような値を持つプロパティを返すことをお勧めします

$ OutputObject = New-Object -TypeName PSObject $ OutputObject | -Type NoteProperty -Name "OMCodeBaseValueFail" の行の追加-Value $ OMCodeBaseValueFail

キープメンバーに追加|

"$ OutputObjectを追加... - メンバー" と最後にEDIT:無視私の不器用な私。私は、コメントが答えたように問題が何かを見て、あなたの関数が(暗黙のうちに)パイプラインに値を返したことも知っています。私はそれでも、他の場所での再利用を容易にするために、正しいプロパティを持つカスタムオブジェクトを吐き出すことをお勧めします。

+0

コメントの感謝の印。私はあなたの提案を進めるつもりです。 – Keith

関連する問題