2013-03-22 22 views
6

この質問は、私はこの質問を経由して行うことをしようとしていますどのようなアプローチするサブ質問/別の方法である:How can I use PListBuddy to copy an entry from one file to another?PlistBuddyを使用してPlistに配列を追加するにはどうすればよいですか?

私はビルドのXCodeの通過スクリプトをPlistBuddyを使用してplistファイルBへのplistファイルAからエントリをコピーします、Bash/Shellを使用します。これを行うことで、私はPlistBuddyの "コピー"機能を使うことができません。辞書を追加/設定することはできませんが、 "Entries"を介してPlistBuddyとやりとりする必要があるため、個々のエントリをすべての要素でコピーする必要があります。

私がしようとしているのは、PlistファイルAをとり、 "PSMultiValueSpecifier"要素のTitles/Values Arraysを格納することです。私は配列の要素をつかんで画面に表示することができますが、目的のPlistファイルBにそれらを追加すると、配列はまだ空です。

コード:ここで

# 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#### 

は、以下のデータを生成するコードの抜粋です:

新しいエントリを追加する

# 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` 

コード(コードは追加のエントリをつかむために)

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

PlistBuddyの[importコマンド](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html)を見ましたか?これは関連すると聞こえますが、ターゲットファイル全体を 'entry'の下に追加します。 – Richard

+0

ええ、私はimportコマンドを調べました。ターゲットエントリを上書きするようです。私が必要としたのは、ターゲットエントリを追加/変更することでした。基本的に私がやったのは、あるplistの内容を別のplistの内容のサブセットに注入して、ハイブリッドplistファイルを作成することでした。これは、デバッグ設定の強化などのために、コンパイル時のビルドスクリプトによって行われます。 – jhthorp

0

これは問題を解決する可能性がありますが、より大きいマージスクリプトで実装するのは正しい方法ではありません。下の私のansをチェックしてください。

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 
関連する問題