2016-07-11 3 views
0

У меня есть два сценария PowerShell. Один скрипт (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 

Вот второй сценарий.

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

'Новый-PSDrive ...' -> 'Новый-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 | Add-члены -Тип NoteProperty -Name "OMCodeBaseValueFail" -Value $ OMCodeBaseValueFail

Продолжайте добавлять строки для "$ OutputObject | Add-членов ..." и в конце

EDIT: ИГНОРИРОВАНИЯ мой глупый лепет. Я вижу, в чем проблема, на что отвечали комментарии, и я также вижу, что ваша функция (неявно) возвращала значения в конвейер. Я по-прежнему рекомендую, чтобы он выплевывал пользовательский объект с правильными свойствами, тем не менее, чтобы упростить повторное использование в другом месте.

+0

Спасибо markg за комментарии. Я попробую ваши предложения в будущем. – Keith

Смежные вопросы