多个Select-Object作为点符号

时间:2017-12-22 20:24:12

标签: powershell

问题

我想知道是否有一种简单的方法来搜索WMI对象或CIM实例中的多个对象。

我知道可以使用像

这样的命令
new ExtractTextPlugin('../dist/[name].css'),
new CopyWebpackPlugin([ // doesn't work, but this is what I want to accomplish
  {
    from: path.resolve('./dist/[name].css'), // maybe this should be ../dist/[name].css
    to: path.resolve('./dist/[name].transformed.css'), // ../dist/[name].transformed.css
    transform: css => transformed(css)
  }
]),

但是我想要一个带点符号的命令,你可以为Get-CimInstance Win32_BaseBoard | Select-Object Manufacturer,Product 等多个对象设置多个对象。

(Get-CimInstance Win32_BaseBoard).Manufacturer

这样的东西

2 个答案:

答案 0 :(得分:1)

来自评论的Ben解决方案可行,但请注意,它会为您想要的每个属性调用Get-CimInstance一次,即使这不必要(可能需要一段时间,具体取决于您的呼叫&# 39;重新制作)。

让我们看看其他一些方法。我们首先将所需的属性名称存储在一个数组中。

$properties = 'Manufacturer', 'Product'

现在我们可以做类似Ben所做的事情:

$allValues = $properties |
    ForEach-Object -Begin {
        $bb = Get-CimInstance Win32_Baseboard
    } -Process {
        $bb.$_
    }

这样可以保持他的方法,但CIM会调用一次。

如果您想纯粹使用点符号,可以使用.ForEach()方法和.PSObject隐藏属性来获取属性:

(Get-CimInstance Win32Baseboard).ForEach({$_.PSObject.Properties.Where({$_.Name -in $properties}).Value})

答案 1 :(得分:0)

如上所述,DotNotation(Intellisense)是1:1 /单节点/集合的东西。您可以通过将调用结果推送到XML并遍历节点来验证这一点。

(Get-CimInstance Win32_BaseBoard | ConvertTo-Xml).Objects.Object.Property
(Get-CimInstance Win32_BaseBoard | ConvertTo-Xml).Objects.Object.Property.name
(Get-CimInstance Win32_BaseBoard | ConvertTo-Xml).Objects.Object.Property.'#text'

我头脑中唯一的另一个选择是构建一个代理,该代理使用枚举和开关来处理您正在使用的命名空间的所有可能属性。

这就是BenH所指出的更多不必要的努力和代码,特别是因为你必须为每个班级做到这一点。

现在,如果您只想简写这个,可以这样做

$Base = Get-CimInstance Win32_BaseBoard
$Base.Manufacturer;$base.Model;$base.Name;$Base.PartNumber

但这只是笨拙的,特别是,因为所有这些真正做的是使用命令中断分隔符(分号)在单行上设置的单个命令。这是一件错误的事情。恕我直言。

---小咆哮--- 如果你需要分隔符,那么只需将下一个东西放在一个新行上并避免使用分号。我的意思是,我可以看到分号用作PoSH控制台主机,但是在真实的脚本中,功能,模块,嗯,只是,没有。再次,恕我直言 ---小咆哮---

最后,根据您的目标PoSH版本,DotNotation在v2 - v3天出现问题

相关问题