如何在 OS X 中的终端中隐藏/显示 Wi-Fi 菜单项?

如何在 OS X 中的终端中隐藏/显示 Wi-Fi 菜单项?

我希望能够从终端隐藏和显示 Wi-Fi 菜单项。我可以使用命令来做到这一点defaults吗?

我把范围缩小到了com.apple.systemuiserver。它看起来像这样:

{
    "NSWindow Frame NoTimeLeft" = "471 437 475 163 0 0 1366 746 ";
    "__NSEnableTSMDocumentWindowLevel" = 1;
    menuExtras =     (
        "/System/Library/CoreServices/Menu Extras/Script Menu.menu",
        "/System/Library/CoreServices/Menu Extras/AirPort.menu",
        "/System/Library/CoreServices/Menu Extras/TimeMachine.menu",
        "/System/Library/CoreServices/Menu Extras/Battery.menu",
        "/System/Library/CoreServices/Menu Extras/Clock.menu"
    );
}

偏好设置截图

答案1

这里的一个大困难是,当您在菜单栏中拖动菜单附加功能(以及添加和删除它们)时,menuExtras输入的键是一个重新排序的数组。com.apple.systemuiserver

在上述情况下,Wi-Fi 菜单附加项是第二项(它是数组索引 1,因为这些数组像 C 数组一样是零索引的),因此您可以使用 删除它PlistBuddy,但它不在您的 中,$PATH因为它隐藏在 中/usr/libexec。您必须使用PlistBuddy因为该defaults命令没有用于指定数组索引的语法。然后终止 SystemUIServer 以使其重新加载:

/usr/libexec/PlistBuddy -c 'Delete :menuExtras:1' ~/Library/Preferences/com.apple.systemuiserver.plist
killall SystemUIServer

要将其重新添加,请执行以下操作:

/usr/libexec/PlistBuddy -c 'Add :menuExtras:1 string "/System/Library/CoreServices/Menu Extras/AirPort.menu"' ~/Library/Preferences/com.apple.systemuiserver.plist
killall SystemUIServer

请注意,如果您删除或添加菜单附加项,导致 Wi-Fi 菜单附加项不是菜单栏左侧第二个菜单附加项,则此操作将失败。只需编写一些脚本,您就可以遍历数组以menuExtras查找 AirPort (Wi-Fi) 菜单附加项,记下其索引,然后将其输入到您的 PlistBuddy 命令中。

答案2

我编写了一个脚本,循环浏览菜单附加项并删除 WiFi。如果您知道菜单附加项中的菜单项名称,则可以轻松地将其修改为任何其他菜单项。我没有在脚本末尾放置 kill SystemUIServer。如果您想要立即满意,可以将其添加为脚本的最后一行。注销/登录可能也应该有效。我相信 sed 行也可以清理一下。这已在 10.8.4 上进行了测试,但没有理由它不应该至少在 10.6 上工作

#!/bin/sh

# Removes the Wifi menu from the menubar.
# This setting is set on a per-user basis, so needs to be run as the user
# Will require a logout. A 'kill SystemUIServer' might work?

OIFS="$IFS"

menutemp=$(defaults read com.apple.systemuiserver menuExtras)
menutemp2=$(echo $menutemp | sed 's/( //')
menutemp3=$(echo $menutemp2 | sed 's/ )//')

IFS=','
read -a menuitems <<< "$menutemp3"
IFS="$OIFS"

for (( i = 0 ; i < ${#menuitems[@]} ; i++ ))
do
    if [ "${menuitems[$i]}" = '"/System/Library/CoreServices/Menu Extras/AirPort.menu"' ]
    then
        /usr/libexec/PlistBuddy -c "Delete :menuExtras:$i" ~/Library/Preferences/com.apple.systemuiserver.plist
    fi
done

答案3

为所有其他用户隐藏图标的不同策略。转到/System/Library/CoreServices/Menu Extras/,您将看到几个以菜单结尾的文件。单击要隐藏的菜单。选择菜单后,使用键盘并按住Command+I以显示信息菜单。

在共享和权限:下,单击加号框(您可能需要先解锁此区域)并将您的用户名添加到列表中,授予您自己读写权限。然后将所有人的权限更改为无访问权限。不要管系统和 Wheel。关闭窗口。注销并以其他用户身份登录。您可以隐藏许多菜单。

答案4

使用这组命令设法使其在 High Sierra 10.13.6 上运行。这将删除所有菜单项但这正是我需要的。

defaults write com.apple.systemuiserver "NSStatusItem Visible com.apple.menuextra.airport" 0
defaults delete com.apple.systemuiserver menuExtras
defaults -currentHost write com.apple.systemuiserver dontAutoLoad -array "/System/Library/CoreServices/Menu Extras/AirPort.menu"
killall SystemUIServer

相关内容