【问题标题】:Powershell Custom object - not passing foreach variablePowershell自定义对象-不传递foreach变量
【发布时间】:2015-11-11 19:12:34
【问题描述】:

我正在尝试根据来自文本文件的服务器名称创建自定义对象。 我拥有的脚本将 txt 文件导入到变量中。然后在 servers 变量中运行一个 foreach 服务器来创建自定义对象。我希望能够将对象的属性输出为每次不包含标题信息的表。

请参阅下面的脚本和输出:

 $SERVERS = gc c:\servers.txt


foreach ($srv in $SERVERS)
{
    $Obj = New-Object PsObject -Property`
   @{
         Computername = $srv
         SecurityGroup = (Get-QADComputer $srv).memberof
         RebootDay = ((Get-QADComputer $srv).memberof).split(',').split(' ')[2]
         Combined = ((Get-QADComputer $srv).memberof).split(',').split(' ').split('=')[1]
         RebootTime = $obj.combined.substring(0,4)
     }

 echo $obj | ft Computername,RebootDay -autosize

}

这是当前的输出:

计算机名重启日


SERVER007 星期日

计算机名重启日


SERVER009 周日

计算机名重启日


SERVER003 星期日


我希望它看起来更像:

计算机名重启日


SERVER007 星期日
SERVER001 星期日
SERVER009 周日

【问题讨论】:

    标签: loops powershell hashtable pscustomobject formattable


    【解决方案1】:

    TessellatingHeckler 确实走在了正确的轨道上。他的代码的问题是你不能将ForEach($x in $y){} 循环传递给任何东西(不要与你通常看到的缩短为ForEachForEach-Object 循环混淆,比如$Servers | ForEach{<code here>})你不想要要将对象一次传递给Format-Table,您希望将一组对象传递给它,以使其看起来不错。所以这里是修改后的代码:

    $SERVERS = gc c:\servers.txt
    
    $Results = foreach ($srv in $SERVERS)
    {
        New-Object PsObject -Property @{
             Computername = $srv
             SecurityGroup = (Get-QADComputer $srv).memberof
             RebootDay = ((Get-QADComputer $srv).memberof).split(',').split(' ')[2]
             Combined = ((Get-QADComputer $srv).memberof).split(',').split(' ').split('=')[1]
             RebootTime = $obj.combined.substring(0,4)
         }
    }
    $Results | FT ComputerName,RebootDay -auto
    

    将对象收集到一个数组中,然后将整个数组传递给Format-Table

    【讨论】:

      【解决方案2】:

      不要将“ft”(Format-Table)命令放在循环内部,将其放在外部,一次,最后。例如

      $SERVERS = gc c:\servers.txt
      
      $results = foreach ($srv in $SERVERS)
      {
          $Obj = New-Object PsObject -Property`
         @{
               Computername = $srv
               SecurityGroup = (Get-QADComputer $srv).memberof
               RebootDay = ((Get-QADComputer $srv).memberof).split(',').split(' ')[2]
               Combined = ((Get-QADComputer $srv).memberof).split(',').split(' ').split('=')[1]
               RebootTime = $obj.combined.substring(0,4)
           }
          $Obj
      } 
      $results | ft Computername,RebootDay -autosize
      

      编辑:修复了 foreach 管道错误。

      您可以稍微整理一下,因为您不需要为哈希表创建新的 PSObject,然后将对象放入管道;您无需重复 Get-QADComputer 命令 3 次。我怀疑 $obj.combined 行没有做任何事情 - 在新对象调用的属性中,如何在它被分配该名称之前引用它?重复的splits 可能会被组合起来,因为它作用于单个字符,而不是字符串。

      gc c:\servers.txt | foreach {
          $memberof = (Get-QADComputer $_).memberof
      
          @{
              Computername = $_;
              SecurityGroup = $memberof;
              RebootDay = $memberof.split(', ')[2];
              Combined = $memberof.split(', =')[1];
              # ?? RebootTime = $obj.combined.substring(0,4)
          }
      } | ft Computername,RebootDay -autosize
      

      【讨论】:

      • 您不能将ForEach 循环的输出通过管道传输到任何内容(不要与可以缩短为ForEach 的内联ForEach-Object 循环混淆)。而是做类似$Results = ForEach($srv in $SERVERS){<same code here>};$Results|FT ComputerName,RebootDay -auto
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2016-01-26
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多