ForEach-Object中Export-CSV中的计算机名

时间:2015-08-04 09:28:33

标签: .net powershell csv foreach

我试图在我的ComputerNames.csv文件中获取每台计算机的已安装.NET Framework版本。 到目前为止,这是我的代码:

$ComputerNames = Import-csv $ListPath\ComputerNames.csv
$ComputerNames | ForEach-Object {
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version -EA 0 |
# Where { $_.PSChildName -match '^(?!S)\p{L}'} |
Select Version
} | Export-Csv "$ExportPath\FrameWorkVersion-$DateTime.csv"

当我运行此代码时,它会创建所有已安装的.NET Framework版本的CSV输出,这很不错。但是我想把它分配给计算机名称。

我很难用英语解释这个,所以这里有一个例子:

到目前为止的输出:

TYPE Selected.System.Management.Automation.PSCustomObject
Version
2.0.50727.4927
2.0.50727.4927
3.0.30729.4926
3.0.30729.4926
3.0.30729.7903
3.0.4506.4926
3.0.6920.4902
3.5.30729.4926
3.5.30729.5003
4.5.51641
4.5.51641
4.5.51641

我想这样:

TYPE Selected.System.Management.Automation.PSCustomObject
Version
Computer 1
2.0.50727.4927
2.0.50727.4927
3.0.30729.4926
3.0.30729.4926
3.0.30729.7903
Computer 2
3.0.4506.4926
3.0.6920.4902
3.5.30729.4926
3.5.30729.5003
4.5.51641
Computer 3
4.5.51641
4.5.51641

这可能吗?

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的那样,您可能会将计算机名称传递给ForEach-Object,但您并未使用它们进行任何操作,因此,您有效地重新运行相同的查询你自己的机器很多次。

您可以使用Invoke-Command在远程计算机上运行脚本,如下所示:

$ComputerNames = Import-csv $ListPath\ComputerNames.csv
$ComputerNames | ForEach-Object {
    # $_ refers to the current item in the pipeline, in this case, an object with a computer name in the "name" property
    $ComputerName = $_.Name
    $ScriptBlock = {
        Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version -EA 0 | Select-Object Version
    }
    # This is where the magic happens
    Invoke-Command -ComputerName $ComputerName -ScriptBlock $ScriptBlock | Select @{Name="Computer";Expression = { $ComputerName } },Version
} | Export-Csv "$ExportPath\FrameWorkVersion-$DateTime.csv" -NoTypeInformation

现在,由于@{Name="Computer";Expression={$ComputerName}}之后的select语句中的计算属性Invoke-Command,你csv将有一个"计算机"列 a"版本"柱