这个问题是一个子问题/替代方法,可以通过这个问题来实现我想要做的事情: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:(抓取新增条目的代码)
# 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`添加新条目的代码:
# 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####以下是生成以下数据的代码片段:
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 "#########"下面是提供的数据,证明正在传输正确的字段
#########
[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的未记录功能有任何了解,请提供帮助。手册页非常薄,示例也很多。
我想要感谢你阅读这篇文章,并感谢你的智慧帮助我解决了我脖子上的这个主要疼痛。
发布于 2013-03-23 11:01:51
也许有一种更好的方法可以做到这一点,但我已经解决了这个问题,方法是对源数组中的元素进行计数,然后逐个复制它们。
${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... 发布于 2013-08-06 15:24:32
它可能会解决您的问题,但它不是在大型合并脚本中实现的正确方式。检查我下面的ans。
/usr/libexec/PlistBuddy -x -c "Print PreferenceSpecifiers" ${FROM_PLIST} > ${TO_PLIST}发布于 2017-09-05 12:54:46
对于像字符串数组这样简单的东西,下面是将任意数量的数组组合在一起的代码。此示例使用iOS信息列表中常见的UIAppFonts数组。
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
donehttps://stackoverflow.com/questions/15573017
复制相似问题