8

この質問は、この質問を介して私がやろうとしていることへのサブ質問/代替方法です: PListBuddy を使用してエントリをあるファイルから別のファイルにコピーするにはどうすればよいですか?

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 のページは非常にスリムで、例は際立っています。

これを読んでくれて、そして私の首のこの大きな痛みを解決するためにあなたの頭脳を貸してくれてありがとう。

4

3 に答える 3

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... 
于 2013-03-23T03:01:51.147 に答える
0

問題は解決するかもしれませんが、大規模なマージ スクリプトに実装するのは適切な方法ではありません。以下の私の答えをチェックしてください。

/usr/libexec/PlistBuddy -x -c "Print PreferenceSpecifiers" ${FROM_PLIST} > ${TO_PLIST}
于 2013-08-06T07:24:31.993 に答える