这个问题是通过这个问题来解决我想要做的事情的子问题/替代方法:How can I use PListBuddy to copy an entry from one file to another?
我想使用Bash / Shell通过XCode构建脚本使用PlistBuddy将Plist文件A中的条目复制到Plist文件B.通过这样做,我不能使用PlistBuddy的“复制”功能。我必须复制每个条目的所有元素,因为你不能添加/设置字典,但必须通过“条目”与PlistBuddy交互。
我要做的是获取Plist文件A并将其标题/值数组存储为“PSMultiValueSpecifier”元素。我能够抓取数组中的元素并将它们打印到屏幕上,但是当我将它们添加到目标Plist文件B中时,数组仍然是空的。
代码:(用于添加条目的代码)
# 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的无证功能有任何了解,请提供帮助。 MAN页面非常纤薄,例子很远。
我要感谢你阅读本文并借助你的大脑来帮助我解决颈部疼痛。
答案 0 :(得分:2)
可能有更好的方法可以做到这一点,但我通过计算源数组中的元素然后单独复制它们来解决这个问题。
${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...
答案 1 :(得分:0)
它可能会解决您的问题,但它不是在较大的合并脚本中实现的正确方法。检查我的下面的问题。
/usr/libexec/PlistBuddy -x -c "Print PreferenceSpecifiers" ${FROM_PLIST} > ${TO_PLIST}
答案 2 :(得分:0)
对于像字符串数组这样简单的东西,这里的代码将组合任意数量的数组。此示例使用iOS Info plists中常见的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
done