Thursday, December 14, 2017

#1 2009-11-09 12:57:03 pm

RamRod53
Member
Registered: 2009-11-09
Posts: 5

Need Help getting information from System Profiler

Hi all, I am new to these forums and AppleScript in general. So far the language is pretty easy but I am having trouble with a certain task. I would like to have a script that pulls the Model Name and Model Identifier from the Mac I am on. I do not really understand how to go about doing this. Any help or resources would be greatly appreciated.

Offline

 

#2 2009-11-09 01:20:09 pm

StefanK
Member
From:: St. Gallen, Switzerland
Registered: 2006-10-21
Posts: 11482
Website

Re: Need Help getting information from System Profiler

Hi,

easiest version

Applescript:


set {modelName, modelIdentifier} to paragraphs of (do shell script "system_profiler SPHardwareDataType | grep 'Model Name\\|Model Identifier' | cut -d ':' -f 2 | cut -b2-")


regards

Stefan

Offline

 

#3 2009-11-09 04:07:08 pm

leonsimard
Member
From:: Montreal, Canada
Registered: 2009-09-27
Posts: 526

Re: Need Help getting information from System Profiler

And here's the long one. I created a routine that I use in various apps:

Applescript:

on getThisMachineSpecs()
   set thisMachineSpecs to {}
   set {thisModelName, thisModelIdent, thisModelCPUName, thisModelCPUSpeed, thisModelCPUNumber, thisModelCPUCores, thisModelRAM, thisModelBusSpeed, thisModelSerial, hardDriveSize, hardDriveFreeSpace, currentIpv4, currentOSVersion, currentShortName, currentLongUserName, currentBootVolume, currentComputerName, currentPrimEthernetAdd} to {"UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN"}
   
   try
       set scanOfSystemHardwareRaw to (do shell script "system_profiler SPHardwareDataType")
       
       set myText to every paragraph of scanOfSystemHardwareRaw
       
       set myOldDelimiters to AppleScript's text item delimiters
       set AppleScript's text item delimiters to {": "}
       
       repeat with myCounter from 5 to (count of items in myText)
           set myLine to item myCounter of myText
           if myLine is "" then
           else
               set {kindData, theData} to text items of myLine
               --display dialog (kindData & return & theData)
               if kindData contains "Model Name" then set thisModelName to theData
               if kindData contains "Model Identifier" then set thisModelIdent to theData
               if kindData contains "Processor Name" then set thisModelCPUName to theData
               if kindData contains "Processor Speed" then set thisModelCPUSpeed to theData
               if kindData contains "Number Of Processors" then set thisModelCPUNumber to theData
               if kindData contains "Total Number Of Cores" then set thisModelCPUCores to theData
               if kindData contains "Memory" then set thisModelRAM to theData
               if kindData contains "Bus Speed" then set thisModelBusSpeed to theData
               if kindData contains "Serial Number" then set thisModelSerial to theData
           end if
       end repeat
       set AppleScript's text item delimiters to myOldDelimiters
   end try
   
   try
       tell (system info) to set currentIpv4 to get IPv4 address
   end try
   try
       tell (system info) to set currentOSVersion to get system version
   end try
   try
       tell (system info) to set currentShortName to get short user name
   end try
   try
       tell (system info) to set currentLongName to get long user name
   end try
   try
       tell (system info) to set currentBootVolume to get boot volume
   end try
   try
       tell (system info) to set currentComputerName to get computer name
   end try
   try
       tell (system info) to set currentPrimEthernetAdd to get primary Ethernet address
   end try
   
   
   if currentOSVersion begins with "10.4" then
       set currentOSVersion to ("Mac OS X Tiger " & currentOSVersion)
   else if currentOSVersion begins with "10.5" then
       set currentOSVersion to ("Mac OS X Leopard " & currentOSVersion)
   else if currentOSVersion begins with "10.6" then
       set currentOSVersion to ("Mac OS X Snow Leopard " & currentOSVersion)
   end if
   
   try
       tell application "System Events" to set HDSizeRaw to (get capacity of startup disk) as number
       set hardDriveSizeTemp to (my round_truncate((HDSizeRaw / 1.0E+9), 0))
       if hardDriveSizeTemp < 1 then set hardDriveSize to ((hardDriveSizeTemp * 1000) & " Mb")
       if hardDriveSizeTemp ≥ 1 then set hardDriveSize to (hardDriveSizeTemp & " Gb")
   end try
   
   try
       tell application "System Events" to set HDFreeSpaceRaw to (get free space of startup disk) as number
       set hardDriveFreeSpaceTemp to (my round_truncate((HDFreeSpaceRaw / 1.0E+9), 0))
       if hardDriveFreeSpaceTemp < 1 then set hardDriveFreeSpace to ((hardDriveFreeSpaceTemp * 1000) & " Mb")
       if hardDriveFreeSpaceTemp ≥ 1 then set hardDriveFreeSpace to (hardDriveFreeSpaceTemp & " Gb")
   end try
   
   set thisMachineSpecs to {thisModelName, thisModelIdent, thisModelCPUName, thisModelCPUSpeed, thisModelCPUNumber, thisModelCPUCores, thisModelRAM, thisModelBusSpeed, thisModelSerial, hardDriveSize, hardDriveFreeSpace, currentIpv4, currentOSVersion, currentShortName, currentLongName, currentBootVolume, currentComputerName, currentPrimEthernetAdd}
   return thisMachineSpecs
end getThisMachineSpecs

It's refers to another routine that rounds numbers to a specified decimal, here it is (works on both french and english computers):

Applescript:

on round_truncate(this_number, decimal_places)
   set LocaleDecimal to "." as text
   
   try
       set testnumber to "0.5" as number
   on error
       set LocaleDecimal to "," as text
   end try
   
   if decimal_places is 0 then
       set this_number to this_number + 0.5
       return number_to_text(this_number div 1)
   end if
   
   set the rounding_value to "5"
   repeat decimal_places times
       set the rounding_value to "0" & the rounding_value
   end repeat
   set the rounding_value to (LocaleDecimal & the rounding_value) as number
   
   set this_number to this_number + rounding_value
   
   set the mod_value to "1"
   repeat decimal_places - 1 times
       set the mod_value to "0" & the mod_value
   end repeat
   set the mod_value to (LocaleDecimal & the mod_value) as number
   
   set second_part to (this_number mod 1) div the mod_value
   if the length of (the second_part as text) is less than the decimal_places then
       repeat decimal_places - (the length of (the second_part as text)) times
           set second_part to ("0" & second_part) as string
       end repeat
   end if
   
   set first_part to this_number div 1
   set first_part to number_to_text(first_part)
   set this_number to (first_part & LocaleDecimal & second_part) as real
   
   return this_number
end round_truncate

on number_to_text(this_number)
   set this_number to this_number as text
   if this_number contains "E+" then
       set x to the offset of "." in this_number
       set y to the offset of "+" in this_number
       set z to the offset of "E" in this_number
       set the decimal_adjust to characters (y - (length of this_number)) thru -1 of this_number as string as number
       if x is not 0 then
           set the first_part to characters 1 thru (x - 1) of this_number as string
       else
           set the first_part to ""
       end if
       set the second_part to characters (x + 1) thru (z - 1) of this_number as string
       set the converted_number to the first_part
       repeat with i from 1 to the decimal_adjust
           try
               set the converted_number to the converted_number & character i of the second_part
           on error
               set the converted_number to the converted_number & "0"
           end try
       end repeat
       return the converted_number
   else
       return this_number
   end if
end number_to_text

The only thing that's not exactly right is how it reports on hard drive sizes and free space, I think my math is off, because it is reported as vendors-style (250 Gb hard disk) instead of logical (238 Gb).

Any one has an idea where i may be wrong?


Filed under: System

Offline

 

#4 2009-11-09 04:29:42 pm

StefanK
Member
From:: St. Gallen, Switzerland
Registered: 2006-10-21
Posts: 11482
Website

Re: Need Help getting information from System Profiler

leonsimard wrote:

The only thing that's not exactly right is how it reports on hard drive sizes and free space, I think my math is off, because it is reported as vendors-style (250 Gb hard disk) instead of logical (238 Gb).


Apple has changed the display of the sizes from binary (1024^x) to decimal(1000^x) prefixes in Snow Leopard


regards

Stefan

Offline

 

#5 2009-11-09 05:02:47 pm

Shane Stanley
Member
From:: Australia
Registered: 2002-12-07
Posts: 5199

Re: Need Help getting information from System Profiler

leonsimard wrote:

It's refers to another routine that rounds numbers to a specified decimal, here it is (works on both french and english computers):


Have a look at NSDecimalNumber's decimalNumberByRoundingAccordingToBehavior_ and initWithString_ methods. They should work in all locales.


Shane Stanley <sstanley@myriad-com.com.au>
www.macosxautomation.com/applescript/apps/

Offline

 

#6 2009-11-09 05:18:39 pm

leonsimard
Member
From:: Montreal, Canada
Registered: 2009-09-27
Posts: 526

Re: Need Help getting information from System Profiler

I'll sure do. This was pre-ASOC, had to manage somehow, the round command was a bit to simple for my needs...

Offline

 

#7 2009-11-09 05:20:37 pm

leonsimard
Member
From:: Montreal, Canada
Registered: 2009-09-27
Posts: 526

Re: Need Help getting information from System Profiler

StefanK wrote:
leonsimard wrote:

The only thing that's not exactly right is how it reports on hard drive sizes and free space, I think my math is off, because it is reported as vendors-style (250 Gb hard disk) instead of logical (238 Gb).


Apple has changed the display of the sizes from binary (1024^x) to decimal(1000^x) prefixes in Snow Leopard


So I should divide by 1024 instead of 1000 to get the correct size? At least to get the same thing as in the Finder... I'll have to implement a if then to chek for pre-10.6 and post 10.6 too i guess...

Offline

 

#8 2009-11-10 10:30:19 am

RamRod53
Member
Registered: 2009-11-09
Posts: 5

Re: Need Help getting information from System Profiler

Thanks all for the help. It worked out great.

Offline

 

Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)