i have a script to gather computer information
$cpus = get-ciminstance -classname Win32_Processor |select-object -Property DeviceID, Name |Export-Csv -Path $cpusfile
$ccpus = Import-Csv -Path $cpusfile
$pcpus = Import-Csv -Path $pcpusfile # this is a copy of the same file from the previous check
$cpuchanges = Compare-Object -ReferenceObject $pcpus -DifferenceObject $cpus -PassThru | Where-Object{$.SideIndicator -eq ‘=>’}
it comes back empty
if i export to txt files and do the same is works. i verified that the variables contain the correct data but with the csv import it does not find the differences.
the only way i found this to work with the csv files if I do
Compare-Object -ReferenceObject (get-ciminstance -classname Win32_Processor) -DifferenceObject (import-csv -Path $pcpusfile) -PassThru |Where-Object {$.sideindicator -eq ‘=>’}
I’m not sure what I am missing. found lots of articles where people do the same kind of import-csv and then compare-objects and seems to work. any help is greatly appreciated
Thorsten,
Welcome back to the forum.
Long time no see.
First of all … when you post code, sample data, console output or error messages please format it as code using the preformatted text button ( </> ). Simply place your cursor on an empty line, click the button and paste your code.
Thanks in advance
How to format code in PowerShell.org 1 <---- Click
![]()
(Sometimes the “preformatted text” button hides behind the settings gear symbol.
)
You import the CSV files into the two variables $ccpus and $pcpus and then you use the variable $cpus for the comparison?! … have you been aware of that? Was that on purpose? I’d recommend longer and more verbose variable names to avoid those kind of confution in general. ![]()
Sorry haven’t been here in a while and forgot about the code syntax, thank you for the reminder
this is a script i use as a nagios plugin
on the first check it gathers the cpu info , ($cpus) then at the end of the scripts it saves $cpus to the file that becomes the baseline for the next check. ($pcpus)
the $cpus is the import of the current cpu check and $pcpus is the import from the previous check.
so to test it i can simply modify the file that is imported to $pcpus to force compare-object to detect the change. so $cpus and $pcus contain different data. if done via txt file import it works, if done via csv file import to the variable the compare-object is empty
you can test it just by running the
$cpus = get-ciminstance -classname Win32_Processor |select-object -Property DeviceID, Name
export this to a csv file, make a copy of that file and slightly modify the data
import-that modified file to another variable, now compare-object those to variables.
thank you
That’s my code …
Get-CimInstance -ClassName Win32_Processor |
Select-Object -Property DeviceID, Name |
Export-Csv -Path .\CPU_01.csv -NoTypeInformation
Get-CimInstance -ClassName Win32_Processor |
Select-Object -Property DeviceID, Name |
Export-Csv -Path .\CPU_02.csv -NoTypeInformation
Now I changed the Name property in the second CSV file
$CPU_01 = Import-Csv -Path .\CPU_01.csv
$CPU_02 = Import-Csv -Path .\CPU_02.csv
$CompareObjectSpalt = @{
ReferenceObject = $CPU_01
DifferenceObject = $CPU_02
Property = 'Name'
PassThru = $true
}
Compare-Object @CompareObjectSpalt
And that’s the ouptut:
DeviceID Name SideIndicator
-------- ---- -------------
CPU0 11th Gen Intel(R) Core(TM) i5-1240P =>
CPU0 12th Gen Intel(R) Core(TM) i5-1240P <=
![]()
I’m not using a property in the compare-object , could that be the issue?
What could happen when you tried? ![]()
testing that right now
that was the issue. as soon as i added the -property ‘name’ it worked. thank you for your help. i didn’t get that from the documentation and what is still confusing is the difference between importing as text vs csv. it must be different objects in the array?