2013-03-22 2 views
6

Этот вопрос Суб-Вопрос/Альтернативный способ подойти, что я пытаюсь сделать через этот вопрос: How can I use PListBuddy to copy an entry from one file to another?Как добавить массив в Plist используя PlistBuddy?

Я хочу, чтобы скопировать запись из Plist файла А в Plist Файл B с помощью PlistBuddy через XCode сценария сборки , используя Bash/Shell. Делая это, я не могу использовать функцию «Копировать» PlistBuddy. Я должен копировать каждую отдельную запись со всеми ее элементами, так как вы не можете добавлять/устанавливать словари, но должны взаимодействовать с PlistBuddy через «Записи».

Что я пытаюсь сделать, это взять файл Plist A и сохранить его массивы Titles/Values ​​для элемента «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} и т. Д. Я не могу опубликовать это как ответ до 8 часов или 10 репутации, поэтому буду комментировать это на данный момент. – jhthorp

ответ

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

Вы просмотрели команду [import] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) в PlistBuddy? Это звучит связанное, но добавляет весь целевой файл под 'entry'. – Richard

+0

Да, я просмотрел команду импорта.Кажется, он перезаписывает запись цели. Мне нужно было добавить/изменить Target Entry. По сути, я сделал инжекцию содержимого одного plist в подмножество содержимого другого plist, чтобы создать гибридный файл plist. Все это делается с помощью скриптов сборки времени компиляции для расширенных параметров отладки и т. Д. – jhthorp

0

Он может исправить вашу проблему, но это неправильный способ реализовать в более крупных сценариях слияния. Проверьте мои анны ниже.

/usr/libexec/PlistBuddy -x -c "Print PreferenceSpecifiers" ${FROM_PLIST} > ${TO_PLIST} 
0

Для чего-то простого, как массив строк, вот код, который объединит произвольное количество массивов. В этом примере используется массив UIAppFonts, общий для iOS Info plists.

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 
Смежные вопросы