我发现了https://itpro.outsidesys.com/2017/10/21/powershell-change-values-in-csv-data/
我想用它来制作一个更新的CSV
,并且没有两次相同的条目。
Get-BitlockerVolume
没有唯一的行数据,所以我可以使用2个页眉/行数据来表示这是ROW1,这是ROW2等。
喜欢使用标题ComputerName
和Mountpoint
中的日期(由于某些PC有一个以上的分区,因此可以多次出现Computername,MountPoint是驱动器号,我想使用这2个信息来识别行。
这可能吗?
#Get all AD Computers ATNB*
$cn = Get-ADComputer -Filter * | Where-Object {$_.Name -like "ATNB*"} | Select -Property Name
foreach ($pc in $cn.name){
#Test connection
$connection = test-connection -buffersize 32 -count 1 -ComputerName $pc -quiet
if ($connection -eq $True) {
#Run command on pc esport to csv add new row
invoke-command -computername $cn.name -scriptblock {get-bitlockervolume} | export-csv -Append "C:\_test\New folder\bitlockercheck.csv"
echo "$pc Info added to CSV"
}
else {echo "$pc is not online"}
}
这是新的/更新的脚本:
$csv = @(Import-Csv "C:\_test\New folder\bvt_2.csv")
#Get all AD Computers ATNB* and start looping
Get-ADComputer -Filter { Name -like "ATNB*" } | ForEach-Object {
# Assign the "Name" value of the current computer to $pc
$pc = $_.Name
# Test connection
if (Test-Connection -buffersize 32 -count 1 -ComputerName $pc -quiet) {
#Run command on pc esport to csv add new row
Invoke-Command -Computername $pc -scriptblock { Get-BitlockerVolume } | ForEach-Object {
# For each bit locker volume...
$volume = $_
# ... see if a row exists for the volume
$csvRow = $csv | Where-Object { $_.ComputerName -eq $pc -and $_.MountPoint -eq $volume.MountPoint }
# if a row exists, update the Data column only
if ($csvRow) {
$csvRow.Data = $volume.Data
echo "$pc Info updated in CSV"
} else {
# Otherwise add a new row to the CSV
$csv += [PSCustomObject]@{
ComputerName = $pc
MountPoint = $volume.MountPoint
Data = $volume.Data
}
echo "$pc Info added to CSV"
}
}
} else {
echo "$pc is not online"
}
}
# Export the updated CSV file
$csv | Export-Csv "C:\_test\New folder\bvt_2.csv" -NoTypeInformation
答案 0 :(得分:0)
由于您使用PSComputerName
时Invoke-Command
可用作额外属性,因此您可以将其用作唯一键。
当您可以访问计算机并列出其BitLockerVolumes时,您将获得完整列表。您基本上想要从CSV文件中删除所有该计算机的卷并添加新列表。
现在我要做的是
所以,按照以下方式:
$CSV_PATH = "C:\_test\New folder\bitlockercheck.csv"
$current_data = Get-ADComputer -Filter 'Name -like "ATNB*"' | Foreach-Object {
if (Test-Connection $_.Name -BufferSize 32 -Count 1 -Quiet) {
Invoke-Command -ComputerName $_.Name -ScriptBlock {Get-BitLockerVolume}
}
}
$computernames = $current_data | Select-Object -ExpandProperty PSComputerName -Unique
$cached_data = Import-Csv $CSV_PATH | Where-Object {
-not ($computernames -contains $_.PSComputerName)
}
$cached_data + $current_data | Export-Csv $CSV_PATH
您绝对应该在AD服务器上进行过滤。您目前的方式是先将所有 AD计算机下载到您的计算机上,然后立即将其中的大部分计算机丢弃。通过将过滤字符串传递给Get-ADComputer
,您将只获得您感兴趣的对象,这样效率会更高。