我是Mac OSX世界的新手,我必须编写一个脚本,该脚本提供了连接的USB设备的供应商ID和产品ID。我已经完成了Windows和Linux,但对于Mac我不知道从哪里开始。Mac OSX获取USB供应商ID和产品ID
我看到这个post,但与示例的链接不起作用。你们有什么建议可以从哪里开始,或者我可以在哪里找到一些例子?
特别是,我应该使用哪种语言?
我是Mac OSX世界的新手,我必须编写一个脚本,该脚本提供了连接的USB设备的供应商ID和产品ID。我已经完成了Windows和Linux,但对于Mac我不知道从哪里开始。Mac OSX获取USB供应商ID和产品ID
我看到这个post,但与示例的链接不起作用。你们有什么建议可以从哪里开始,或者我可以在哪里找到一些例子?
特别是,我应该使用哪种语言?
你用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有很多工作要做。
根据你想要处理的信息,你可以在System Information
查找它。
点击Apple
菜单屏幕,About this Mac
,More Info
,System Report
的左上角和选择Hardware
在左上角,然后USB
。
你也许可以写Applescript来做到这一点,但是如果你打算继续以某种方式与设备进行交互,这可能不是最好的方法。
我需要一个脚本,给定一个USB路径,返回设备的供应商ID和产品ID。我需要独立的信息(我不需要与设备进行交互)。 – Sceik
可以使用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设备,并保存在输出之前。然后让用户插入设备并再次运行相同的命令,以查看插入设备后添加了哪些设备专用文件。也许粗鲁,也许有效 - 只是一个想法。
你使用什么语言的Linux等我会认为C将是一个很好的起点。基于Linux/OSX Unix根 – BillyBigPotatoes
我使用C for Linux和C++ for Windows,但我也可以使用任何其他语言。 – Sceik