2016-11-15 10 views
0

私は関数を作成していて、出力で異常な動作を観察しています。 Powershell関数の出力での問題

この

はコードです:

Function Get-CompInfo 
{ 
    [Cmdletbinding()] 
    PARAM 
    (
     [Parameter(ValueFromPipeline=$true)] 
     [Alias('Comp', 'Host')] 
     [string[]]$computername 
    ) 


    Begin 
    { 

    } 
    Process 
    { 
     if ($computername -eq $Null) { 
       $computername=$env:computername 
       $VerboseOut="No computer specified. Running against local computer $computername :" 
     } 
      Else { 
       $VerboseOut="Getting information for computer $computername :" 
     } 
     Write-Verbose $VerboseOut 
     $CompInfo=Get-WmiObject Win32_Computersystem -computername $computername 
     $OSInfo=Get-WmiObject Win32_OperatingSystem -computername $computername 
       $Properties = [ordered]@{ 
       'Input'=$computername 
       'SystemName'=$CompInfo.Name 
       'Manufacturer'=$CompInfo.Manufacturer 
       'Model'=$CompInfo.Model 
       'PhysicalMemory'=$CompInfo.TotalPhysicalMemory 
       'LogicalProcessors'=$CompInfo.NumberOfLogicalProcessors 
       'OSCaption'=$OSInfo.Caption 
       'OSArchitecture'=$OSInfo.OSArchitecture 
       'ServicePackMajorVersion'=$OSInfo.ServicePackMajorVersion} 

     # Output Information 
     $obj=New-Object -TypeName PSobject -Property $Properties 
     write-output $obj 

    } 
    End 
    { 

    } 
} 

piplineからパラメータを渡す:

"カルマ"、 "localhost" を|取得-CompInfo

Input     : {karuma} 
SystemName    : KARUMA 
Manufacturer   : Hewlett-Packard 
Model     : h9-1400a 
PhysicalMemory   : 17115000832 
LogicalProcessors  : 8 
OSCaption    : Microsoft Windows 10 Pro 
OSArchitecture   : 64-bit 
ServicePackMajorVersion : 0 

Input     : {localhost} 
SystemName    : KARUMA 
Manufacturer   : Hewlett-Packard 
Model     : h9-1400a 
PhysicalMemory   : 17115000832 
LogicalProcessors  : 8 
OSCaption    : Microsoft Windows 10 Pro 
OSArchitecture   : 64-bit 
ServicePackMajorVersion : 0 

を私はコンピュータ名のリストをテキストファイルを渡すとき、私は、出力の同じ種類を取得します。

異なる複数のホスト名に何か指定する場合:

は、Get-CompInfoを-computernameはlocalhost、カルマ

Input     : {localhost, karuma} 
SystemName    : {KARUMA, KARUMA} 
Manufacturer   : {Hewlett-Packard, Hewlett-Packard} 
Model     : {h9-1400a, h9-1400a} 
PhysicalMemory   : {17115000832, 17115000832} 
LogicalProcessors  : {8, 8} 
OSCaption    : {Microsoft Windows 10 Pro, Microsoft Windows 10 Pro} 
OSArchitecture   : {64-bit, 64-bit} 
ServicePackMajorVersion : {0, 0} 

私はで見BYと同じように、複数の値を渡すときに、テーブルの出力を見て期待していフォーマットテーブルへの配管。

私が望むように出力を得るために何を変える必要があるかについての助けをいただければ幸いです。

答えて

0

これは、関数の設定方法です。パイプラインを使用する場合、PROCESSブロックはパイプライン内のオブジェクトごとに1回実行されます。この場合、$ computernameパラメータには一度に1つのオブジェクトしか含まれません。

$ computername paramに2つのコンピュータを指定すると、2つのオブジェクトが含まれているため、関数全体がどのように動作しているかを変更しています。

Function Get-CompInfo 
{ 
    [Cmdletbinding()] 
    PARAM 
    (
     [Parameter(ValueFromPipeline=$true)] 
     [Alias('Comp', 'Host')] 
     [string[]]$computername 
    ) 

    Begin {} 
    Process 
    { 
     Foreach ($computer in $computername) { 
      if ($computer -eq $Null) { 
        $computer=$env:computername 
        $VerboseOut="No computer specified. Running against local computer $computer :" 
      } 
       Else { 
        $VerboseOut="Getting information for computer $computer :" 
      } 
      Write-Verbose $VerboseOut 
      $CompInfo=Get-WmiObject Win32_Computersystem -computername $computer 
      $OSInfo=Get-WmiObject Win32_OperatingSystem -computername $computer 
        $Properties = [ordered]@{ 
        'Input'=$computer 
        'SystemName'=$CompInfo.Name 
        'Manufacturer'=$CompInfo.Manufacturer 
        'Model'=$CompInfo.Model 
        'PhysicalMemory'=$CompInfo.TotalPhysicalMemory 
        'LogicalProcessors'=$CompInfo.NumberOfLogicalProcessors 
        'OSCaption'=$OSInfo.Caption 
        'OSArchitecture'=$OSInfo.OSArchitecture 
        'ServicePackMajorVersion'=$OSInfo.ServicePackMajorVersion} 

      # Output Information 
      $obj=New-Object -TypeName PSobject -Property $Properties 
      write-output $obj 
     } 
    } 
    End {} 
} 
+0

ドム・ジョーンズがいい例で、このbehaviousを説明する素晴らしい記事があります:https://technet.microsoft.com/en-

それはそうのようなforeachの中であなたの関数をラップすることにより、修正するのは簡単ですus/library/hh413265.aspx –

+0

こんにちはJames、ありがとう! 私はそれを見落としたとは思えませんが、それを働かせて、セレクトなどでプロパティを渡すことができました。 その記事も面白そうです、それをチェックアウトします! – J1raya