2013-03-22 89 views
6

這個問題的一個子問題/替代辦法的辦法,我試圖通過這個問題做:How can I use PListBuddy to copy an entry from one file to another?如何使用PlistBuddy將數組添加到Plist中?

我想通過一個Xcode複製從plist文件A到plist文件b。使用PlistBuddy條目構建腳本,使用Bash/Shell。通過這樣做,我不能使用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

可能有更好的方法來做到這一點,但我已經通過計算源數組中的元素然後單獨複製它們來解決此問題。 $ {PLISTBUDDY} -c 「添加PreferenceSpecifiers:$ DEST_INDEX:標題陣列」 $ {DEST_PLIST} $ {PLISTBUDDY} -c 「添加PreferenceSpecifiers:$ DEST_INDEX:標題:0字符串 'TITLE_1'」 $ {DEST_PLIST} 「$ {PLISTBUDDY} -c」添加PreferenceSpecifiers:$ DEST_INDEX:標題:1字符串'TITLE_2'「$ {DEST_PLIST} etc ... 我不能發佈這個答案,直到8小時或10聲望,所以我會評論它現在。 – jhthorp 2013-03-22 16:12:51

回答

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... 
+0

你看過PlistBuddy中的[import command](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html)嗎?這聽起來很相關,但在「入口」下添加了整個目標文件。 – Richard 2013-07-26 16:26:13

+0

是的,我查看了導入命令。它似乎覆蓋了目標條目。我需要的是追加/修改目標條目。基本上我所做的是將一個plist的內容注入到另一個plist內容的子集中以創建一個混合plist文件。這全部通過編譯時生成腳本來完成,以增強調試設置等。 – jhthorp 2013-07-26 20:02:04

0

它可能會解決你的問題,但它不是在較大的合併腳本來實現的正確途徑。在下面檢查我的答案。

/usr/libexec/PlistBuddy -x -c "Print PreferenceSpecifiers" ${FROM_PLIST} > ${TO_PLIST} 
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