2012-02-13 4 views
0

Я создал две функции в Powershell, первая функция функции получит ключ реестра, если существует return имя_компьютера и boolan, второй получить список установленных обновлений Windows и проверить, существует ли какое-то обновление. ... и вернуть имя_компьютер и boolan allso .. сейчас проблема в том, что Whan я пытаюсь получить доступ к 1-му объекту в трубе я получаю пустой ...Доступ 1-й объект в трубке powershell

Function Get-RegKey { 
<# 
.SYNOPSIS 
    "By OhadH 2012" 
.DESCRIPTION 
    Read Key From Registry and create it if not exist 
.PARAMETER LiteralPath 
.EXAMPLE 
    Get-RegKey -strMachine "127.0.0.1" -Location "Software\\MyKey" -strValue "Type" -strValueToSearch "Server" 
     Read The Registry key from "HKLM\Software\MyKey" the value Type and search for the value "Server" 
.EXAMPLE 
    Get-RegKey "127.0.0.1" "Software\\MyKey" "Type" "Server" 
     Read The Registry key from "HKLM\Software\MyKey" the value Type and search for the value "Server" 
     By Postion and not by value name 
.NOTES 
Author: OhadH 
Date: Feb 09, 2012  
#> 
    param (
     [parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true)][String]$strMachine, 
     [parameter(Mandatory = $true,Position=1)][String]$Location, 
     [parameter(Mandatory = $true,Position=2)][String]$strValue, 
     [parameter(Mandatory = $true,Position=3)][String]$strValueToSearch 
     ) 
    begin { $obj = New-Object psobject } 
    process { 
     try { 
      $obj | Add-Member NoteProperty 'strMachine' $strMachine -Force 
      $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $strMachine) 
      $regKey = $reg.OpenSubKey($Location,$true) 
      $RegRead = $regKey.GetValue($strValue) 
      if ($RegRead -eq $strValueToSearch) { $obj | Add-Member NoteProperty 'RegExist' $true -Force } 
       else { $obj | Add-Member NoteProperty 'RegExist' $false -Force } 
      } 
     catch [System.Exception] { $obj | Add-Member NoteProperty 'RegExist' "!!Error!!" -Force } 
    } 
    end { return $obj } 
} 

Function Set-RegKey { 
<# 
.SYNOPSIS 
    "By OhadH" 
.DESCRIPTION 
    Create Registry Key 
.PARAMETER LiteralPath 
.EXAMPLE 
    Set-RegKey -strMachine "127.0.0.1" -Location "Software\\MyKey" -strValue "Type" -strValueToSet "Server" 
     Read The Registry key from "HKLM\Software\MyKey" the value Type and search for the value "Server" 
.EXAMPLE 
    Get-RegKey "127.0.0.1" "Software\\MyKey" "Type" "Server" 
     Read The Registry key from "HKLM\Software\MyKey" the value Type and search for the value "Server" 
     By Postion and not by value name 
.NOTES 
Author: OhadH 
Date: Feb 09, 2012  
#> 
    param (
     [parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true)][String]$strMachine, 
     [parameter(Mandatory = $true,Position=1)][String]$Location, 
     [parameter(Mandatory = $true,Position=2)][String]$strValue, 
     [parameter(Mandatory = $true,Position=3)][String]$strValueToSet 
     ) 
    begin { $obj = New-Object psobject } 
    process { 
     try { 
      $obj | Add-Member NoteProperty 'strMachine' $strMachine -Force 
      $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $strMachine) 
      $reg.CreateSubKey($Location) | Out-Null 
      $regKey = $reg.OpenSubKey($Location,$true) 
      $regKey.SetValue($strValue,$strValueToSet,"String") 
      } 
     catch [System.Exception] { } 
    } 
    end { } 
} 

Function Get-WindowsUpdate { 
<# 
.SYNOPSIS 
    "By OhadH" 
.DESCRIPTION 
    Get specific Installed KB 
.PARAMETER LiteralPath 
.EXAMPLE 
    Get-WindowsUpdate -strMachine 127.0.0.1 -strUpdate "KB2633952" 
     Get if KB2633952* installed on local machine 
.EXAMPLE 
    Get-WindowsUpdate 127.0.0.1 "KB2633952" 
     Get if KB2633952* installed on local machine 
.NOTES 
Author: OhadH 
Date: Feb 09, 2012  
#> 
    param (
    [parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][String]$strMachine, 
    [parameter(Mandatory = $true,Position=1,ValueFromPipeline=$true)][String]$strUpdate 
    ) 
    begin { $obj = New-Object psobject } 
    process { 
      try { 
       $obj | Add-Member NoteProperty 'strMachine' $strMachine -Force 
       if ((gwmi -ComputerName $strMachine Win32_QuickFixEngineering | ? {$_.HotFixID -like $strUpdate+"*"}) -ne $null) 
        { $obj | Add-Member NoteProperty 'KBInstalled' $true -Force } 
       else { $obj | Add-Member NoteProperty 'KBInstalled' $false -Force }   
      } 
      catch [System.Exception] { $obj | Add-Member NoteProperty 'KBInstalled' "!!Error!!" -Force }   
    } 
    end { return $obj } 
} 

$subnet = '10.0.0.' 
for ($i=1; $i -le 250; $i++) { 
$cntIP = $subnet + $i 
if ($cntIP = ($cntIP | Ping-Host -icmp | where { $_.Responding }).IPAddress) { 
    Set-RegKey -strMachine $cntIP "SOFTWARE\\MyKey" -strValue "Type" -strValueToSet "Server" 
    Get-RegKey -strMachine $cntIP "SOFTWARE\\MyKey" -strValue "Type" -strValueToSearch "Server" | Get-WindowsUpdate -strUpdate "KB2633952" | select strMachine,**@{N="RegExist";E={$_.RegExist}},**KBInstalled 
} 
} 

Спасибо за помощь Ohad

+0

Какая часть всего этого дает вам проблемы? Каково ожидаемое поведение? –

+0

whan я пытаюсь получить доступ к 1-му элементу в трубе ... 'Get-RegKey -strMachine $ cntIP" SOFTWARE \\ MyKey "-strValue" Type "-strValueToSearch" Сервер "| Get-WindowsUpdate -strUpdate "KB2633952" | выберите strMachine, @ {N = "RegExist"; E = {$ _. RegExist}}, KBInstalled' Я хочу получить значение ** RegExist ** из 1-го конвейера. если я получу функции один за другим, я могу получить доступ ко всем свойствам ... но в трубе я не могу получить доступ к значениям в ** RegExist ** – OhadH

+0

PS: ** RegExist ** - это значение, возвращаемое Get-RegKey – OhadH

ответ

0

Если я следую, вам нужно подключить Get-RegKey к Foreach-Object и внутри foreach сохранить ссылку на нужный объект. Если у вас есть конвейер, состоящий из трех команд (например, get-something | do-something | set-something), то третий командлет в конвейере (например, set-something) не может получить доступ к объекту из командлета upstream (например, get-something).

+0

Вы имели в виду что-то вроде этого? 'PS C: \> Get-RegKey -strMachine $ cntIP" ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \\ MyKey "-strValue" Тип "-strValueToSearch" Сервер "| % {Get- WindowsUpdate $ _. StrMachine -strUpdate "KB2633952"} | выберите strMachine, @ {N = "RegExist"; E = {$ _. RegExist}}, KBInstalled' ... P.S: У вас отличный блог ... – OhadH

+0

Toda Ohad :). Да, точно так же, внутри foreach вы можете назначить текущий объект переменной и использовать его позже в коде. –

+0

Я сделал переосмысление о том, как объединить значение в самой «Powershell», и это то, что я нашел :) 'Get-RegKey -strMachine $ cntIP" SOFTWARE \\ MyKey "-strValue" Тип "-strValueToSearch" Сервер "| выберите strMachine, @ {N = "KBInstalled"; E = {(Get-WindowsUpdate -strMachine $ _. strMachine -strUpdate "KB2633952"). KBInstalled}}, RegExist' Благодарим за помощь ... – OhadH

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

  • Нет связанных вопросов^_^