Найти запись в plist используя PlistBuddy (osx)

1021
Dan

Я пытаюсь найти на компьютере Mac, если у текущего пользователя включена поддержка документов iCloud. Я нашел plist, где это находится (MobileMeAccounts.plist), но я мог бы использовать некоторую помощь с синтаксисом plistbuddy для нацеливания вниз в дереве.

Вот часть сценария, который у меня есть:

#!/bin/bash  # Purpose: Grab iCloud Document Status  plistBud="/usr/libexec/PlistBuddy"  if [[ -e "/Users/*loggedInUser*/Library/Preferences/MobileMeAccounts.plist" ]]; then  iCloudStatus=`$plistBud -c "print :Accounts:Services:MOBILE_DOCUMENTS" /Users/$loggedInUser/Library/Preferences/MobileMeAccounts.plist` else  iCloudDocuments="Not Enabled"  fi  echo "$iCloudStatus" 

Я специально ищу следующий код, чтобы быть правдой:

<key>Enabled</key> <true/> 

Вот этот список. Если вы прокрутите вниз, вы увидите «MOBILE_DOCUMENTS» с его включением:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Accounts</key> <array> <dict> <key>AccountAlternateDSID</key> <string>99999999</string> <key>AccountDSID</key> <string>999999</string> <key>AccountDescription</key> <string>iCloud</string> <key>AccountID</key> <string>*****@gmail.com</string> <key>AccountUUID</key> <string>9999999</string> <key>DisplayName</key> <string>User Name</string> <key>LoggedIn</key> <true/> <key>Services</key> <array> <dict> <key>Name</key> <string>CLOUDDESKTOP</string> <key>ServiceID</key> <string>com.apple.Dataclass.CloudDesktop</string> <key>status</key> <string>active</string> </dict> <dict> <key>Name</key> <string>FAMILY</string> <key>ServiceID</key> <string>com.apple.Dataclass.Family</string> <key>showManageFamily</key> <true/> </dict> <dict> <key>Enabled</key> <true/> <key>Name</key> <string>MOBILE_DOCUMENTS</string> <key>ServiceID</key> <string>com.apple.Dataclass.Ubiquity</string> <key>apsEnv</key> <string>production</string> <key>authMechanism</key> <string>token</string> <key>url</key> <string>https://p48-ubiquity.icloud.com:443</string> <key>wsUrl</key> <string>https://p48-ubiquityws.icloud.com:443</string> </dict> 
1

1 ответ на вопрос

0
Moritz

Ты почти там.

Хитрость в том, что вы должны указать, какой объект вы хотите в каждом массиве. Добавьте этот индекс в путь XML, и все в порядке.

Чтобы получить список элементов в массиве:

/usr/libexec/PlistBuddy -c "print :Accounts:0:Services" ~/Library/Preferences/MobileMeAccounts.plist 

В моем случае MOBILE_DOCUMENTSэто первый элемент, поэтому он имеет индекс 0 (второй элемент будет индексом 1, третий элемент - индексом 2 и т. Д.).

Это работает для меня:

/usr/libexec/PlistBuddy -c "print :Accounts:0:Services:0:Enabled" ~/Library/Preferences/MobileMeAccounts.plist 

даст «ложь» или «правда».