从多台计算机获取 WMI 数据并导出到 CSV
Get WMI Data From Multiple Computers and Export to CSV
所以今天有一些不错的老式 Powershell 挫折。我需要做的是:
- 从文件中获取计算机列表
- 从 Win32_OperatingSystem
中查询 "CSName" 和 "InstallDate" 的那些计算机
- 将 InstallDate 转换为可用的日期格式。
- 将所有内容导出到 .Csv
我已经尝试了很多不同的脚本迭代。我 运行 分为 2 个主要问题。一是即使使用 Export-Csv -Append
,我也无法导出并附加到 .Csv。它只接受第一个值,对其余值不做任何处理。第二个是在管道 |
.
时我无法让日期时间转换器工作
这是我尝试过的一些示例 - none 其中有效。
这个例子简直就是错误多多。似乎没有从管道中的 WMI 查询中携带 $_
。看起来它正在尝试使用第一个管道中的数据,但我不确定。
Get-Content -Path .\Computernames.txt | Foreach-Object {
gwmi Win32_OperatingSystem -ComputerName $_) |
Select-Object $_.CSName, $_.ConvertToDateTime($OS.InstallDate).ToShortDateString()
} | Export-Csv -Path Filename -Force -Append -NoTypeInformation
}
这个只导出第一个值,导出.Csv时放弃其余值
$Computers = Get-Content -Path .\Computernames.txt
foreach ($Computer in $Computers) {
echo $Computer
$OS = gwmi Win32_OperatingSystem -ComputerName $Computer
$OS | Select-Object
$OS.CSName,$OS.ConvertToDateTime($OS.InstallDate).ToShortDateString() |
Export-Csv -Path $Log.FullName -Append
}
这个确实获取了数据,但是当我尝试 select 任何东西时,我得到空值,但我可以 echo
就好了。
$OS = gwmi Win32_OperatingSystem -ComputerName $Computers
$OS | Foreach-Object {
Select-Object $_.CSName,$_.ConvertToDateTime($OS.InstallDate).ToShortDateString() |
Export-Csv -Path $Log.FullName -Force -Append -NoTypeInformation
}
这感觉应该简单得离谱。我几乎可以毫不费力地在 C# 中做到这一点,但我就是无法让 PS 做我想做的事。任何帮助将不胜感激!
给你,
$Array = @() ## Create Array to hold the Data
$Computers = Get-Content -Path .\Computernames.txt
foreach ($Computer in $Computers)
{
$Result = "" | Select CSName,InstallDate ## Create Object to hold the data
$OS = Get-WmiObject Win32_OperatingSystem -ComputerName $Computer
$Result.CSName = $OS.CSName ## Add CSName to line1
$Result.InstallDate = $OS.ConvertToDateTime($OS.InstallDate).ToShortDateString() ## Add InstallDate to line2
$Array += $Result ## Add the data to the array
}
$Array = Export-Csv c:\file.csv -NoTypeInformation
所以今天有一些不错的老式 Powershell 挫折。我需要做的是:
- 从文件中获取计算机列表
- 从 Win32_OperatingSystem 中查询 "CSName" 和 "InstallDate" 的那些计算机
- 将 InstallDate 转换为可用的日期格式。
- 将所有内容导出到 .Csv
我已经尝试了很多不同的脚本迭代。我 运行 分为 2 个主要问题。一是即使使用 Export-Csv -Append
,我也无法导出并附加到 .Csv。它只接受第一个值,对其余值不做任何处理。第二个是在管道 |
.
这是我尝试过的一些示例 - none 其中有效。
这个例子简直就是错误多多。似乎没有从管道中的 WMI 查询中携带 $_
。看起来它正在尝试使用第一个管道中的数据,但我不确定。
Get-Content -Path .\Computernames.txt | Foreach-Object {
gwmi Win32_OperatingSystem -ComputerName $_) |
Select-Object $_.CSName, $_.ConvertToDateTime($OS.InstallDate).ToShortDateString()
} | Export-Csv -Path Filename -Force -Append -NoTypeInformation
}
这个只导出第一个值,导出.Csv时放弃其余值
$Computers = Get-Content -Path .\Computernames.txt
foreach ($Computer in $Computers) {
echo $Computer
$OS = gwmi Win32_OperatingSystem -ComputerName $Computer
$OS | Select-Object
$OS.CSName,$OS.ConvertToDateTime($OS.InstallDate).ToShortDateString() |
Export-Csv -Path $Log.FullName -Append
}
这个确实获取了数据,但是当我尝试 select 任何东西时,我得到空值,但我可以 echo
就好了。
$OS = gwmi Win32_OperatingSystem -ComputerName $Computers
$OS | Foreach-Object {
Select-Object $_.CSName,$_.ConvertToDateTime($OS.InstallDate).ToShortDateString() |
Export-Csv -Path $Log.FullName -Force -Append -NoTypeInformation
}
这感觉应该简单得离谱。我几乎可以毫不费力地在 C# 中做到这一点,但我就是无法让 PS 做我想做的事。任何帮助将不胜感激!
给你,
$Array = @() ## Create Array to hold the Data
$Computers = Get-Content -Path .\Computernames.txt
foreach ($Computer in $Computers)
{
$Result = "" | Select CSName,InstallDate ## Create Object to hold the data
$OS = Get-WmiObject Win32_OperatingSystem -ComputerName $Computer
$Result.CSName = $OS.CSName ## Add CSName to line1
$Result.InstallDate = $OS.ConvertToDateTime($OS.InstallDate).ToShortDateString() ## Add InstallDate to line2
$Array += $Result ## Add the data to the array
}
$Array = Export-Csv c:\file.csv -NoTypeInformation