2016-07-11 9 views
0

Ich habe zwei PowerShell-Skripts. Ein Skript (omreg.ps1) enthält eine Funktion, die ein paar Dinge in der Windows-Registry überprüft und einige Werte zurückgibt; und das andere Skript (test.ps1) verweist auf omreg.ps1, ruft die Funktion auf und versucht, die Werte aus den Variablen in omreg.ps1 abzurufen. Die Variablen in omreg.ps1 geben die korrekten Werte innerhalb der Funktion selbst zurück, die Werte werden jedoch nicht ordnungsgemäß an test.ps1 übergeben. Ich habe viele andere Funktionen, die ähnliche Dinge tun und keine Probleme haben, die Variablenwerte von diesen Funktionen an ein anderes PowerShell-Skript zu übergeben. Ich bin nicht sicher, warum ich das Problem mit dieser speziellen Funktion bekomme. Jede Hilfe wäre willkommen.PowerShell: Übergeben von Variablenwerten zwischen Skripts

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" 
} 

Und hier sind die zurückgegebenen Werte (was ich erwarte):

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

Hier ist das zweite Skript.

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" 

Und hier ist, wie die Werte in test.ps1 zurückgegeben zu werden (nicht, was ich erwarten sollte die gleiche wie oben sein):

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

Sie sind ein Genie! Danke, mein guter Herr. – Keith

Antwort

0

Ihre erste Funktion schreibt auf den Konsolen-Host und schreibt nicht in einen Ausgabestream. Ich weiß nicht genau, welches Format möchten Sie die Antworten in zurückgegeben, sondern nur die Saiten zu erfassen, ändern

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

Um

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

Im Wesentlichen Sie die erste Funktionsausgabe an die haben müssen Pipeline und nicht zum Konsolen-Host. Ich würde vorschlagen, ein benutzerdefiniertes Objekt zu erstellen und Eigenschaften mit Werten wie

zurückgeben

$ OutputObject = New-Objekt -TypeName PSObject $ OutputObject | Add-Mitglied -Art Noteproperty -Name "OMCodeBaseValueFail" -Value $ OMCodeBaseValueFail

Halten Sie das Hinzufügen Linien für "$ OutputObject | Add-Mitglied ..." und am Ende

EDIT: Disregard mein dummes Geplapper. Ich sehe, was das Problem war, wie durch die Kommentare beantwortet, und ich sehe auch, dass Ihre Funktion (implizit) Werte an die Pipeline zurückgegeben hat. Ich würde dennoch empfehlen, ein benutzerdefiniertes Objekt mit den richtigen Eigenschaften ausspucken zu lassen, um die Wiederverwendung an anderer Stelle zu erleichtern.

+0

Vielen Dank für die Kommentare. Ich werde deine Vorschläge in Zukunft versuchen. – Keith

Verwandte Themen