首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PlistBuddy将数组添加到Plist?

如何使用PlistBuddy将数组添加到Plist?
EN

Stack Overflow用户
提问于 2013-03-22 22:36:19
回答 3查看 12K关注 0票数 8

这个问题是一个子问题/替代方法,可以通过这个问题来实现我想要做的事情:How can I use PListBuddy to copy an entry from one file to another?

我想通过XCode构建脚本,使用PlistBuddy将一个条目从Plist文件A复制到Plist文件B。这样,我就不能使用PlistBuddy的"Copy“函数。我必须复制每个条目及其所有元素,因为您不能添加/设置字典,但必须通过“条目”与PlistBuddy交互。

我要做的是获取Plist文件A并为"PSMultiValueSpecifier“元素存储它的标题/值数组。我可以抓取数组中的元素并将它们打印到屏幕上,但是当我将它们添加到目标Plist文件B中时,数组仍然是空的。

Code:(抓取新增条目的代码)

代码语言:javascript
复制
# Configure the Entry
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX dict" ${DEST_PLIST}
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Type string 'PSMultiValueSpecifier'" ${DEST_PLIST}

# Retrieve the Additional Field Value
preferenceTitle=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Title" $SOURCE_PLIST 2>&1`
preferenceKey=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Key" $SOURCE_PLIST 2>&1`
preferenceDefaultValue=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:DefaultValue" $SOURCE_PLIST 2>&1`
preferenceValues=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Values" $SOURCE_PLIST 2>&1`
preferenceTitles=`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Titles" $SOURCE_PLIST 2>&1`

添加新条目的代码:

代码语言:javascript
复制
# Set the Additional Field Values
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Title string $preferenceTitle" ${DEST_PLIST}
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Key string $preferenceKey" ${DEST_PLIST}
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:DefaultValue integer $preferenceDefaultValue" ${DEST_PLIST}
####BORKEN####
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Values array $preferenceValues" ${DEST_PLIST}
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles array $preferenceTitles" ${DEST_PLIST}
####BORKEN####

以下是生成以下数据的代码片段:

代码语言:javascript
复制
echo "#########"
echo "[$THIS] adding $preference: $preferenceDict"
echo "#########"
echo "Source: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Values" $SOURCE_PLIST`
echo "Source: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$SOURCE_INDEX:Titles" $SOURCE_PLIST`
echo "#########"
echo "Destination: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$DEST_INDEX:Values" $DEST_PLIST`
echo "Destination: "`$PLISTBUDDY -c "Print PreferenceSpecifiers:$DEST_INDEX:Titles" $DEST_PLIST`
echo "#########"

下面是提供的数据,证明正在传输正确的字段

代码语言:javascript
复制
#########
[addDebugSettingsMenu.bash] adding : Dict {
    Titles = Array {
        Meters
        Feet
    }
    DefaultValue = 1
    Values = Array {
        1
        2
    }
    Key = UserPreferences_UnitsKey
    Type = PSMultiValueSpecifier
    Title = Units
}
#########
Source: Array {     1     2 }
Source: Array {     Meters     Feet }
#########
Destination: Array { }
Destination: Array { }
#########

如果您对PlistBuddy的未记录功能有任何了解,请提供帮助。手册页非常薄,示例也很多。

我想要感谢你阅读这篇文章,并感谢你的智慧帮助我解决了我脖子上的这个主要疼痛。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-23 11:01:51

也许有一种更好的方法可以做到这一点,但我已经解决了这个问题,方法是对源数组中的元素进行计数,然后逐个复制它们。

代码语言:javascript
复制
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles array" ${DEST_PLIST}    
${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles:0 string 'TITLE_1'" 
${DEST_PLIST} ${PLISTBUDDY} -c "Add PreferenceSpecifiers:$DEST_INDEX:Titles:1 string 'TITLE_2'" ${DEST_PLIST} 
etc... 
票数 2
EN

Stack Overflow用户

发布于 2013-08-06 15:24:32

它可能会解决您的问题,但它不是在大型合并脚本中实现的正确方式。检查我下面的ans。

代码语言:javascript
复制
/usr/libexec/PlistBuddy -x -c "Print PreferenceSpecifiers" ${FROM_PLIST} > ${TO_PLIST}
票数 0
EN

Stack Overflow用户

发布于 2017-09-05 12:54:46

对于像字符串数组这样简单的东西,下面是将任意数量的数组组合在一起的代码。此示例使用iOS信息列表中常见的UIAppFonts数组。

代码语言:javascript
复制
TMP_NAME=`basename $0`
TMP_DIR=`mktemp -d ${PROJECT_TEMP_DIR}/${TMP_NAME}.XXXXXX` || exit 1
FONTS_PLIST="${TMP_DIR}/Fonts.plist"

/usr/libexec/PlistBuddy -c "Add UIAppFonts array" "${FONTS_PLIST}"

# Iterate through each array, adding to the array entry in the temporary plist
index=0
for arg; do
  status=0
  inner_index=0
  while [ ${status} -eq 0 ]; do
    set +e
    # No easy way to get array length, so keep going until we go out of bounds
    entry=`/usr/libexec/PlistBuddy -c "Print UIAppFonts:${inner_index}" "${arg}" 2> /dev/null`
    status=${?}
    set -e
    if [ ${status} -eq 0 ]; then
      /usr/libexec/PlistBuddy -c "Add UIAppFonts:${index} string ${entry}" "${FONTS_PLIST}"
      index=`expr ${index} + 1`
      inner_index=`expr ${inner_index} + 1`
    fi
  done
done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15573017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档