我正在使用这个BetterTouchToll让我的触控条更有趣,非常酷。
他接受一些Apple Scripts更具动态性,所以我开始研究这个脚本。
现在我想在我的触控条上显示我的Magic Mouse Battery,为此我尝试了这段代码,但是没有用。
if application "Mouse" is running then
tell application "Mouse"
return (get Battery)
end tell
end if
return "no mouse"
我的猜测是,鼠标不是一个应用程序,但不知道该放置什么
答案 0 :(得分:2)
获取电池电量的传统方法是在命令行上使用ioreg
。然而,传统的这种做法似乎不再适用于至少macOS High Sierra / 10.13.4;也就是说,他们不再允许选择仅显示单个蓝牙设备的电池百分比。
所以这是一个假设魔术鼠标永远是ioreg显示的最后一个设备的黑客。如果不是在不同的macOS安装中,则可能会失败,然后跨越不同的版本。
ioreg -c AppleDeviceManagementHIDEventService | grep BatteryPercent | tail -1 | sed 's/[^[:digit:]]//g'
在AppleScript中,这将是:
do shell script "ioreg -c AppleDeviceManagementHIDEventService | grep BatteryPercent | tail -1 | sed 's/[^[:digit:]]//g'"
您的代码设置也可以检测Magic Mouse未连接的时间。产品名称位于ioreg的“产品”属性中。例如:
ioreg -c AppleDeviceManagementHIDEventService | grep '"Product" ='
因此,为确保最终设备是鼠标,您可以这样做:
set finalDevice to do shell script "ioreg -c AppleDeviceManagementHIDEventService | grep '\"Product\" =' | tail -1"
if finalDevice contains "Magic Mouse" then
set remaining to do shell script "ioreg -c AppleDeviceManagementHIDEventService | grep BatteryPercent | tail -1 | sed 's/[^[:digit:]]//g'"
remaining & "%"
else
"no mouse"
end if
基本逻辑:
ioreg
。tail
仅获取列表中的最终产品。ioreg
抓取所有电池百分比列表。tail
仅获取列表中的最终电池百分比。sed
仅获取该行的实际数字。对于较早使用ioreg
的方法,请参阅:
答案 1 :(得分:0)
非常感谢您的解决方案。非常鼓舞人心。由于我有多个设备,因此我根据您的解决方案制作了自己的脚本。我想在这里分享它,以免对其他人有用。
由于我有多个蓝牙设备,因此它们在ioreg中的顺序取决于它们的连接顺序。这意味着我不能认为鼠标是最后一个设备。
我在shell中而不是在applescript中完成了大部分工作,因为我对shell更有经验,因此可以更快地完成。使用Applescript过滤ioreg的输出将是一个“清洁”的解决方案:p
警告:我知道这段代码简直糟透了,但是编写起来很快,并且可以完成工作,不要以为这是做事的一种方式。
我的解决方案
在BTT中,以下脚本调用了shell脚本
set devicename to "Magic Mouse 2" -- The name of the device in ioreg
set displayname to "Mouse" -- The name to display on the touchbar
set remaining to do shell script "~/.dotfiles/shell/device_battery_level.sh" & " " & quoted form of devicename
if remaining is "" then
"" --No device present = no output to touchbar
else
displayname & " " & remaining & "%" -- Show output on touchbar
end if
如所见,代码几乎只调用了shell脚本。变量“ devicename”中提供的名称用作脚本的参数,并且是脚本将在ioreg中查找的名称。如果Shell脚本输出一个空脚本,则不会显示任何小部件。对我来说,这比显示“无设备”更好。
“〜/ .dotfiles / shell / device_battery_level.sh”中的脚本如下所示:
#!/bin/sh
DEVICES=$(ioreg -r -l -n AppleHSBluetoothDevice | egrep '"BatteryPercent" = |^ \| "Bluetooth Product Name" = ') #Lets get a list of all bluetooth devices
DEVICELINE=$(grep -n "$1" <<< "$DEVICES") #$1 is the device that this script was called with. Lets extract only the line with that device
if [$DEVICELINE = ""] #If DEVICELINE is empty the name of the device was not in the output and it is properly not connected.
then
echo "" #Device not present, lets give BTT an empty string
else
LINENR="${DEVICELINE:0:1}" #Then we find out where the line of the device is located
NEXTLINE=$(expr $LINENR + "1") #The battery level is at the next line therefore we increment the line number
SEDCOMMAND="p"
BATTERYLINE=$(echo "$DEVICES" | sed -n $NEXTLINE$SEDCOMMAND) # Now we can extract the line with the battery percent
echo $BATTERYLINE | sed 's/[^[:digit:]]//g' #Finally we just need to get the digit and echo that to BTT
fi
基本逻辑与上述答案相同。除了不是使用带尾部的ioreg抓取最后一行外,egrep仅用于输出相关行。 egrep代码基于此处的另一篇文章:https://apple.stackexchange.com/questions/293502/how-can-i-determine-the-battery-level-of-my-magic-mouse-from-the-command-line/293505#293505 基于此,找到提及设备名称的行。逻辑是,由于电池电量信息始终在ioreg中的设备名称下方,因此提取列表中的下一行必须是电池电量。