我试图在我的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
这可能吗?
答案 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"版本"柱