\nSerial Number<\/p>\n<\/li>\n<\/ul>\n
ETC.<\/p>\n
I can pull this info locally, having a hard time for Remote Systems.<\/p>\n
Any advice?<\/p>\n
God Bless,<\/p>\n
-Mike<\/p>\n
Script so Far:<\/p>\n
import-module activedirectory \n$DaysInactive = 183 #define days \n$time = (Get-Date).Adddays(-($DaysInactive)) \nGet-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties whenCreated,whenChanged, LastLogonTimeStamp, Enabled, OperatingSystem |\n \nselect-object Name,@{Name=\"Stamp\"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}}, whenCreated, whenChanged ,Enabled, OperatingSystem \n#| export-csv c:\\Reports\\OLD_Computer.csv -notypeinformation\n\n<\/code><\/pre>","upvoteCount":9,"answerCount":11,"datePublished":"2023-02-02T23:43:47.000Z","author":{"@type":"Person","name":"spiceuser-drpy3","url":"https://community.spiceworks.com/u/spiceuser-drpy3"},"acceptedAnswer":{"@type":"Answer","text":"I call my “PC Inventory” script my “magnum opus”. I hardly knew PowerShell when I started, and finishing it (so far) has given me massive amounts of knowledge of PS.<\/p>\n
To inventory remote PCs, look to the -ComputerName parameter in almost all cmdlets, including Get-ADComputer.<\/p>\n
Maybe this will get you a little further down the road:<\/p>\n
ForEach ($PC in (Get-ADComputer -Filter {OperatingSystem -notlike \"*SERVER*\"} | Sort Name).Name) {\n\tWrite-Progress -Activity \"Inventorying Hardware.\" -Status \"Checking $PC\" \n# Make sure it's online and answering RPC\n\tIf (Test-Connection $PC -Count 1 -Quiet){\n\t\t$MB = Get-WMIObject Win32_ComputerSystem -ComputerName $PC} # Serial, Hardware from here\n\t\tIf ($MB){ # meaning RPC, etc. are working...\n\t# do stuff...\n\t\t\tGet-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties whenCreated,whenChanged, LastLogonTimeStamp, Enabled, OperatingSystem |\n\t\t\tSelect-Object Name,@{Name=\"Stamp\"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}}, whenCreated, whenChanged ,Enabled, OperatingSystem \n\t\t} # End if GWMI returned data\n\t} # End if PC is online\n} # End For Each PC\n<\/code><\/pre>\nYou could refactor that to eliminate the extra Get-ADComputer call…<\/p>\n
Serial Number can be had by:<\/p>\n
Get-WmiObject win32_SystemEnclosure -ComputerName $PC).SerialNumber\n<\/code><\/pre>\nGet-WmiObject Win32_Processor -ComputerName $PC\n<\/code><\/pre>\n…will give you CPU, Speed, Cores, etc.<\/p>\n
For RAM, I wanted DETAILS, so I cobbled this together which you can use to get what you want:<\/p>\n
# RAM Installed\n\t\t\"`t`t`t`tRAM\"\n\t\t$RAMArray = Get-WmiObject -Class \"Win32_PhysicalMemoryArray\" -namespace \"Root\\CIMV2\" -ComputerName $PC\n\t\t$AllSlots = Get-WmiObject -Class \"Win32_PhysicalMemory\" -namespace \"Root\\CIMV2\" -ComputerName $PC\n\t\t\"`tTotal Installed RAM: \" + ((Get-WmiObject -Class \"CIM_PhysicalMemory\" -ComputerName $PC | \n\t\t Measure-Object -Property Capacity -Sum).Sum / 1GB) + \" GB\"\n\t\t\"`tTotal Number of DIMM Slots: $($RAMArray.MemoryDevices)\"\n\t\t\"`n\" \n\t\tForeach ($DIMM In $AllSlots) # Disclose info for each DIMM\n\t\t\t{\n\t\t\t\"Memory Installed: `t$($DIMM.DeviceLocator)`t$($DIMM.Description)\"\n\t\t\t\"BankLabel: `t$($DIMM.BankLabel)\"\n\t\t\t\"Memory Size: `t$(($DIMM.Capacity / 1GB)) GB\"\n\t\t\t\"Speed: `t$($DIMM.Speed)\"\n\t\t\t\"TotalWidth: `t$($DIMM.TotalWidth)\"\n\t\t\t\"FormFactor: `t$($DIMM.FormFactor)\"\n\t\t\t\"Manufacturer: `t$($DIMM.Manufacturer)\"\n\t\t\tif ($DIMM.Model) {\"Model: `t$($DIMM.Model)\"} ## This seems blank a lot, so why print it?\n\t\t\tif ($DIMM.Caption -ne $DIMM.Description) { ## Redundant? Thanks fer nuttin.\n\t\t\t\t\"Caption: `t$($DIMM.Caption)\"}\n\t\t\tif ($DIMM.Name -ne $DIMM.Description) { ## Oh, even more redundant? Lovely.\n\t\t\t\t\"Name: `t$($DIMM.Name)\"}\n\t\t\t\"Part Number: `t$($DIMM.PartNumber)\"\n\t\t\t\"Serial Number: `t$($DIMM.SerialNumber)\"\n\t\t\tif ($DIMM.Attributes) {\"Attributes: `t$($DIMM.Attributes)\"} ## Usually blank but useful if not.\n\t\t\t\"`n\"\n\t\t} # End ForEach DIMM\n<\/code><\/pre>\n(You can tell I was green by the use of quoted strings to output data!)<\/p>","upvoteCount":1,"datePublished":"2023-02-09T16:34:55.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/11","author":{"@type":"Person","name":"jimlong3","url":"https://community.spiceworks.com/u/jimlong3"}},"suggestedAnswer":[{"@type":"Answer","text":"
Hello Spice Heads,<\/p>\n
What I need, is the following:<\/p>\n
\n\nAll Remote Computers<\/p>\n<\/li>\n
\nLast Authentication Time<\/p>\n<\/li>\n
\nOperating System<\/p>\n<\/li>\n
\nEnabled in Active Directory<\/p>\n<\/li>\n
\nHardware Information (Model, RAM, Storage, Processor)<\/p>\n<\/li>\n
\nSerial Number<\/p>\n<\/li>\n<\/ul>\n
ETC.<\/p>\n
I can pull this info locally, having a hard time for Remote Systems.<\/p>\n
Any advice?<\/p>\n
God Bless,<\/p>\n
-Mike<\/p>\n
Script so Far:<\/p>\n
import-module activedirectory \n$DaysInactive = 183 #define days \n$time = (Get-Date).Adddays(-($DaysInactive)) \nGet-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties whenCreated,whenChanged, LastLogonTimeStamp, Enabled, OperatingSystem |\n \nselect-object Name,@{Name=\"Stamp\"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}}, whenCreated, whenChanged ,Enabled, OperatingSystem \n#| export-csv c:\\Reports\\OLD_Computer.csv -notypeinformation\n\n<\/code><\/pre>","upvoteCount":9,"datePublished":"2023-02-02T23:43:47.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/1","author":{"@type":"Person","name":"spiceuser-drpy3","url":"https://community.spiceworks.com/u/spiceuser-drpy3"}},{"@type":"Answer","text":"No, not all that info is in AD, so you have to query each machine for some of that info. e.g.<\/p>\n\n\n
<\/div>\n
msandusky001:<\/div>\n
\n\n\nHardware Information (Model, RAM, Storage, Processor)<\/p>\n<\/li>\n
\nSerial Number<\/p>\n<\/li>\n<\/ul>\n<\/blockquote>\n<\/aside>\n
also be advised that lastLogontimeStamp can be up to 14 days behind.<\/p>\n\n\n
<\/div>\n
msandusky001:<\/div>\n
\nAll Remote Computers<\/p>\n<\/blockquote>\n<\/aside>\n
what makes a computer a ‘remote’ computer? do you have a certain OU for that, or anything else you can filter by?<\/p>\n
You’d basically run all the machines though a for each loop and try to connect to them (e.g. with invoke-command or get-ciminstance depending what exactly you need.)<\/p>","upvoteCount":1,"datePublished":"2023-02-02T23:52:13.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/2","author":{"@type":"Person","name":"Neally","url":"https://community.spiceworks.com/u/Neally"}},{"@type":"Answer","text":"
Yeah, so it would be all Computers on the Network.<\/p>\n
All the specs for each system.<\/p>\n
ETC…<\/p>","upvoteCount":0,"datePublished":"2023-02-02T23:54:49.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/3","author":{"@type":"Person","name":"spiceuser-drpy3","url":"https://community.spiceworks.com/u/spiceuser-drpy3"}},{"@type":"Answer","text":"\n\n
<\/div>\n
msandusky001:<\/div>\n
\nAll the specs for each system<\/p>\n<\/blockquote>\n<\/aside>\n
that means everything and nothing, what are you looking for?<\/p>\n
that’s the theory: \nyou want to add some error handling and such. (e.g. if it does not ping)<\/p>\n
import-module activedirectory \n$DaysInactive = 183 \n$time = (Get-Date).Adddays(-$DaysInactive) \n\n$machines = \nGet-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties whenCreated,whenChanged, LastLogonTimeStamp, Enabled, OperatingSystem \n\n$computerReport = \nforeach($machine in $machines){\n\n $cpuInfo = Get-CimInstance -ClassName Win32_Processor -ComputerName $machine.name -ErrorAction SilentlyContinue\n $ramInfo = Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $machine.name -ErrorAction SilentlyContinue\n\n [pscustomobject]@{\n name = $machine.name\n Stamp = [DateTime]::FromFileTime($machine.lastLogonTimestamp)\n whenCreated = $machine.whenCreated\n whenChanged = $machine.whenChanged\n Enabled = $machine.Enabled\n Operatingsystem = $machine.Operatingsystem\n CPU = $cpuInfo.name\n RAM = \"$(($ramInfo.Capacity | Measure-Object -sum).sum / 1GB) GB\"\n\n }\n}\n\n$computerReport | \nExport-Csv \"c:\\Reports\\OLD_Computer-$(get-date -Format 'yyyyMMdd').csv\" -NoTypeInformation\n<\/code><\/pre>","upvoteCount":0,"datePublished":"2023-02-03T00:09:29.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/4","author":{"@type":"Person","name":"Neally","url":"https://community.spiceworks.com/u/Neally"}},{"@type":"Answer","text":"Try this one line PowerShell script<\/p>\n
Get-ADComputer -Filter * -Properties * | select Name,ObjectID,OperatingSystem,Enabled,LastLogonTimestamp<\/em><\/p>","upvoteCount":0,"datePublished":"2023-02-03T01:34:17.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/5","author":{"@type":"Person","name":"sam054","url":"https://community.spiceworks.com/u/sam054"}},{"@type":"Answer","text":"Firstly, you should not be running PS scripts on such invasive scale to retrieve so much information. If you can do it, that means “others” can do it as well as you would have opened some rather generic local firewall permissions & ports.<\/p>\n
I would highly recommend using Inventory software like from Teamviewer, PDQ, or spiceworks to create an Inventory of your hardware then perform scans as you need to update the details.<\/p>","upvoteCount":1,"datePublished":"2023-02-03T02:40:55.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/6","author":{"@type":"Person","name":"adrian_ych","url":"https://community.spiceworks.com/u/adrian_ych"}},{"@type":"Answer","text":"\n\n
<\/div>\n
Sam054:<\/div>\n
\nTry this one line PowerShell script<\/p>\n
Get-ADComputer -Filter * -Properties * | select Name,ObjectID,OperatingSystem,Enabled,LastLogonTimestamp<\/em><\/p>\n<\/blockquote>\n<\/aside>\nthat’s bad practice, there is no reason to pull all ( * ) properties if he does not need them, just pull what you need.<\/p>\n
Get-ADComputer -Filter * -Properties OperatingSystem,lastlogondate | \nselect Name,Enabled,lastlogondate\n<\/code><\/pre>\nBut then again, that does not take care of the issues that he needs more data than AD can provide.<\/p>","upvoteCount":0,"datePublished":"2023-02-03T03:04:01.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/7","author":{"@type":"Person","name":"Neally","url":"https://community.spiceworks.com/u/Neally"}},{"@type":"Answer","text":"\n\n
<\/div>\n
adrian_ych:<\/div>\n
\nI would highly recommend using Inventory software like from Teamviewer, PDQ, or spiceworks to create an Inventory of your hardware then perform scans as you need to update the details.<\/p>\n<\/blockquote>\n<\/aside>\n
I agree on inventory software but I’d stay away from TeamViewer.<\/p>","upvoteCount":0,"datePublished":"2023-02-03T03:05:56.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/8","author":{"@type":"Person","name":"Neally","url":"https://community.spiceworks.com/u/Neally"}},{"@type":"Answer","text":"\n\n
<\/div>\n
Neally:<\/div>\n
\n\n\n
<\/div>\n
adrian_ych:<\/div>\n
\nI would highly recommend using Inventory software like from Teamviewer, PDQ, or spiceworks to create an Inventory of your hardware then perform scans as you need to update the details.<\/p>\n<\/blockquote>\n<\/aside>\n
I agree on inventory software but I’d stay away from TeamViewer.<\/p>\n<\/blockquote>\n<\/aside>\n
Bro…may I know why ?? As a remote admin, its expensive as compared to splashtop etc… but if you add in stuff like security, backup (now they have client backup to their AWS storage) and Inventory tool…it kinda makes a bit more sense.<\/p>","upvoteCount":0,"datePublished":"2023-02-03T12:28:32.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/9","author":{"@type":"Person","name":"adrian_ych","url":"https://community.spiceworks.com/u/adrian_ych"}},{"@type":"Answer","text":"
Definitely agreed on the use of an RMM / inventory tool. If you’re looking to just gather something quick (once, maybe twice), you can do so with the above PowerShell provided by Neally. If you have a large number of computers, it could take a while. To speed things up, Get-CimInstance supports asynchornous queries, but requires a bit more code to handle effectively. If you have a fair amount, but not a “lot”, you could use a simple where clause to look things up. If you do have a “lot”, I’d recommend a hashtable with the computer name as key and the value the result. That way you’re not iterating each collection for every computer.<\/p>\n
$cpuInfo = Get-CimInstance -ClassName Win32_Processor -ComputerName $machines -ErrorAction SilentlyContinue\n$ramInfo = Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $machines -ErrorAction SilentlyContinue\n<\/code><\/pre>","upvoteCount":0,"datePublished":"2023-02-06T12:15:38.000Z","url":"https://community.spiceworks.com/t/powershell-all-remote-computers-info-etc/945503/10","author":{"@type":"Person","name":"saidbrandon","url":"https://community.spiceworks.com/u/saidbrandon"}}]}}
Hello Spice Heads,
What I need, is the following:
All Remote Computers
Last Authentication Time
Operating System
Enabled in Active Directory
Hardware Information (Model, RAM, Storage, Processor)
Serial Number
ETC.
I can pull this info locally, having a hard time for Remote Systems.
Any advice?
God Bless,
-Mike
Script so Far:
import-module activedirectory
$DaysInactive = 183 #define days
$time = (Get-Date).Adddays(-($DaysInactive))
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties whenCreated,whenChanged, LastLogonTimeStamp, Enabled, OperatingSystem |
select-object Name,@{Name="Stamp"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}}, whenCreated, whenChanged ,Enabled, OperatingSystem
#| export-csv c:\Reports\OLD_Computer.csv -notypeinformation
9 Spice ups
Neally
(Neally)
February 2, 2023, 11:52pm
2
No, not all that info is in AD, so you have to query each machine for some of that info. e.g.
msandusky001:
also be advised that lastLogontimeStamp can be up to 14 days behind.
msandusky001:
All Remote Computers
what makes a computer a ‘remote’ computer? do you have a certain OU for that, or anything else you can filter by?
You’d basically run all the machines though a for each loop and try to connect to them (e.g. with invoke-command or get-ciminstance depending what exactly you need.)
1 Spice up
Yeah, so it would be all Computers on the Network.
All the specs for each system.
ETC…
Neally
(Neally)
February 3, 2023, 12:09am
4
that means everything and nothing, what are you looking for?
that’s the theory:
you want to add some error handling and such. (e.g. if it does not ping)
import-module activedirectory
$DaysInactive = 183
$time = (Get-Date).Adddays(-$DaysInactive)
$machines =
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties whenCreated,whenChanged, LastLogonTimeStamp, Enabled, OperatingSystem
$computerReport =
foreach($machine in $machines){
$cpuInfo = Get-CimInstance -ClassName Win32_Processor -ComputerName $machine.name -ErrorAction SilentlyContinue
$ramInfo = Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $machine.name -ErrorAction SilentlyContinue
[pscustomobject]@{
name = $machine.name
Stamp = [DateTime]::FromFileTime($machine.lastLogonTimestamp)
whenCreated = $machine.whenCreated
whenChanged = $machine.whenChanged
Enabled = $machine.Enabled
Operatingsystem = $machine.Operatingsystem
CPU = $cpuInfo.name
RAM = "$(($ramInfo.Capacity | Measure-Object -sum).sum / 1GB) GB"
}
}
$computerReport |
Export-Csv "c:\Reports\OLD_Computer-$(get-date -Format 'yyyyMMdd').csv" -NoTypeInformation
sam054
(Sam054)
February 3, 2023, 1:34am
5
Try this one line PowerShell script
Get-ADComputer -Filter * -Properties * | select Name,ObjectID,OperatingSystem,Enabled,LastLogonTimestamp
adrian_ych
(adrian_ych)
February 3, 2023, 2:40am
6
Firstly, you should not be running PS scripts on such invasive scale to retrieve so much information. If you can do it, that means “others” can do it as well as you would have opened some rather generic local firewall permissions & ports.
I would highly recommend using Inventory software like from Teamviewer, PDQ, or spiceworks to create an Inventory of your hardware then perform scans as you need to update the details.
1 Spice up
Neally
(Neally)
February 3, 2023, 3:04am
7
Sam054:
Try this one line PowerShell script
Get-ADComputer -Filter * -Properties * | select Name,ObjectID,OperatingSystem,Enabled,LastLogonTimestamp
that’s bad practice, there is no reason to pull all ( * ) properties if he does not need them, just pull what you need.
Get-ADComputer -Filter * -Properties OperatingSystem,lastlogondate |
select Name,Enabled,lastlogondate
But then again, that does not take care of the issues that he needs more data than AD can provide.
Neally
(Neally)
February 3, 2023, 3:05am
8
I agree on inventory software but I’d stay away from TeamViewer.
adrian_ych
(adrian_ych)
February 3, 2023, 12:28pm
9
Bro…may I know why ?? As a remote admin, its expensive as compared to splashtop etc… but if you add in stuff like security, backup (now they have client backup to their AWS storage) and Inventory tool…it kinda makes a bit more sense.
Definitely agreed on the use of an RMM / inventory tool. If you’re looking to just gather something quick (once, maybe twice), you can do so with the above PowerShell provided by Neally. If you have a large number of computers, it could take a while. To speed things up, Get-CimInstance supports asynchornous queries, but requires a bit more code to handle effectively. If you have a fair amount, but not a “lot”, you could use a simple where clause to look things up. If you do have a “lot”, I’d recommend a hashtable with the computer name as key and the value the result. That way you’re not iterating each collection for every computer.
$cpuInfo = Get-CimInstance -ClassName Win32_Processor -ComputerName $machines -ErrorAction SilentlyContinue
$ramInfo = Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $machines -ErrorAction SilentlyContinue
jimlong3
(Jim6795)
February 9, 2023, 4:34pm
11
I call my “PC Inventory” script my “magnum opus”. I hardly knew PowerShell when I started, and finishing it (so far) has given me massive amounts of knowledge of PS.
To inventory remote PCs, look to the -ComputerName parameter in almost all cmdlets, including Get-ADComputer.
Maybe this will get you a little further down the road:
ForEach ($PC in (Get-ADComputer -Filter {OperatingSystem -notlike "*SERVER*"} | Sort Name).Name) {
Write-Progress -Activity "Inventorying Hardware." -Status "Checking $PC"
# Make sure it's online and answering RPC
If (Test-Connection $PC -Count 1 -Quiet){
$MB = Get-WMIObject Win32_ComputerSystem -ComputerName $PC} # Serial, Hardware from here
If ($MB){ # meaning RPC, etc. are working...
# do stuff...
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties whenCreated,whenChanged, LastLogonTimeStamp, Enabled, OperatingSystem |
Select-Object Name,@{Name="Stamp"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}}, whenCreated, whenChanged ,Enabled, OperatingSystem
} # End if GWMI returned data
} # End if PC is online
} # End For Each PC
You could refactor that to eliminate the extra Get-ADComputer call…
Serial Number can be had by:
Get-WmiObject win32_SystemEnclosure -ComputerName $PC).SerialNumber
Get-WmiObject Win32_Processor -ComputerName $PC
…will give you CPU, Speed, Cores, etc.
For RAM, I wanted DETAILS, so I cobbled this together which you can use to get what you want:
# RAM Installed
"`t`t`t`tRAM"
$RAMArray = Get-WmiObject -Class "Win32_PhysicalMemoryArray" -namespace "Root\CIMV2" -ComputerName $PC
$AllSlots = Get-WmiObject -Class "Win32_PhysicalMemory" -namespace "Root\CIMV2" -ComputerName $PC
"`tTotal Installed RAM: " + ((Get-WmiObject -Class "CIM_PhysicalMemory" -ComputerName $PC |
Measure-Object -Property Capacity -Sum).Sum / 1GB) + " GB"
"`tTotal Number of DIMM Slots: $($RAMArray.MemoryDevices)"
"`n"
Foreach ($DIMM In $AllSlots) # Disclose info for each DIMM
{
"Memory Installed: `t$($DIMM.DeviceLocator)`t$($DIMM.Description)"
"BankLabel: `t$($DIMM.BankLabel)"
"Memory Size: `t$(($DIMM.Capacity / 1GB)) GB"
"Speed: `t$($DIMM.Speed)"
"TotalWidth: `t$($DIMM.TotalWidth)"
"FormFactor: `t$($DIMM.FormFactor)"
"Manufacturer: `t$($DIMM.Manufacturer)"
if ($DIMM.Model) {"Model: `t$($DIMM.Model)"} ## This seems blank a lot, so why print it?
if ($DIMM.Caption -ne $DIMM.Description) { ## Redundant? Thanks fer nuttin.
"Caption: `t$($DIMM.Caption)"}
if ($DIMM.Name -ne $DIMM.Description) { ## Oh, even more redundant? Lovely.
"Name: `t$($DIMM.Name)"}
"Part Number: `t$($DIMM.PartNumber)"
"Serial Number: `t$($DIMM.SerialNumber)"
if ($DIMM.Attributes) {"Attributes: `t$($DIMM.Attributes)"} ## Usually blank but useful if not.
"`n"
} # End ForEach DIMM
(You can tell I was green by the use of quoted strings to output data!)
1 Spice up