2014-02-26 41 views
6

我是Mac OSX世界的新手,我必須編寫一個腳本,該腳本提供了連接的USB設備的供應商ID和產品ID。我已經完成了Windows和Linux,但對於Mac我不知道從哪裏開始。Mac OSX獲取USB供應商ID和產品ID

我看到這個post,但與示例的鏈接不起作用。你們有什麼建議可以從哪裏開始,或者我可以在哪裏找到一些例子?

特別是,我應該使用哪種語言?

+0

你使用什麼語言的Linux等我會認爲C將是一個很好的起點。基於Linux/OSX Unix根 – BillyBigPotatoes

+0

我使用C for Linux和C++ for Windows,但我也可以使用任何其他語言。 – Sceik

回答

14

你用bash標記了你的問題,所以我會回答它,就好像你問如何在bash中這樣做,而不是問什麼語言使用(這將使問題脫離StackOverflow)。

您可以使用內置工具從system_profiler解析現有數據。例如,這裏的供應商的轉儲:產品對,「位置ID」和製造商...

#!/bin/bash 

shopt -s extglob 

while IFS=: read key value; do 
    key="${key##+()}" 
    value="${value##+()}" 
    case "$key" in 
    "Product ID") 
     p="${value% *}" 
     ;; 
    "Vendor ID") 
     v="${value%% *}" 
     ;; 
    "Manufacturer") 
     m="${value}" 
     ;; 
    "Location ID") 
     l="${value}" 
     printf "%s:%s %s (%s)\n" "$v" "$p" "$l" "$m" 
     ;; 
    esac 
done < <(system_profiler SPUSBDataType) 

這依賴於一個事實,即Location ID是每個USB設備中列出的最後一個項目,這是我的天堂」沒有確鑿的證實。 (這對我來說就是這樣。)

如果您想要(1)更易於閱讀和(2)不依賴bash並因此更具可移植性(儘管不是問題;所有Mac都帶有bash),您可能需要考慮在awk中,而不是純粹的bash做你的繁重:

#!/bin/sh 

system_profiler SPUSBDataType \ 
    | awk ' 
     /Product ID:/{p=$3} 
     /Vendor ID:/{v=$3} 
     /Manufacturer:/{sub(/.*: /,""); m=$0} 
     /Location ID:/{sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m);} 
    ' 

甚至避免在外殼採用完全包裹這樣的:

#!/usr/bin/awk -f 

BEGIN { 

    while ("system_profiler SPUSBDataType" | getline) { 
    if (/Product ID:/) {p=$3} 
    if (/Vendor ID:/) {v=$3} 
    if (/Manufacturer:/) {sub(/.*: /,""); m=$0} 
    if (/Location ID:/) {sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m)} 
    } 

} 

請注意,您也可以以XML格式得到system_profiler輸出:

$ system_profiler -xml SPUSBDataType 

不過,您需要一個XML解析器來處理輸出。而且你會發現在本地bash中解析XML有很多工作要做。

2

根據你想要處理的信息,你可以在System Information查找它。

點擊Apple菜單屏幕,About this MacMore InfoSystem Report的左上角和選擇Hardware在左上角,然後USB

你也許可以寫Applescript來做到這一點,但是如果你打算繼續以某種方式與設備進行交互,這可能不是最好的方法。

+0

我需要一個腳本,給定一個USB路徑,返回設備的供應商ID和產品ID。我需要獨立的信息(我不需要與設備進行交互)。 – Sceik

3

可以使用system_profiler命令,就像這樣:

system_profiler -detailLevel full 

,並從解析outout。或者,您可以將-xml選項添加到system_profiler命令中,並使用awk/grep或Perl中的XML模塊輕鬆解析XML。

例提取物:

| | | | +-o FaceTime HD Camera (Built-in)@0 <class IOUSBInterface, id 0x1000002b2, registered, matched, active, busy 0 (26 ms), retain 7> 

| | | | | { 
| | | | |  "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"} 
| | | | |  "bcdDevice" = 0x755 
| | | | |  "IOUserClientClass" = "IOUSBInterfaceUserClientV3" 
| | | | |  "idProduct" = 0x850b 
| | | | |  "bConfigurationValue" = 0x1 
| | | | |  "bInterfaceSubClass" = 0x1 
| | | | |  "locationID" = 0xfffffffffa200000 
| | | | |  "USB Interface Name" = "FaceTime HD Camera (Built-in)" 
| | | | |  "idVendor" = 0x5ac 

關於路徑USB設備,我不知道你會怎麼做,只是在Mac上。我可能會嘗試運行:

find /dev -type b -o -type c 

插入USB設備,並保存在輸出之前。然後讓用戶插入設備並再次運行相同的命令,以查看插入設備後添加了哪些設備專用文件。也許粗魯,也許有效 - 只是一個想法。

相關問題