2013-03-22 26 views
6

यह सवाल एक उप-प्रश्न/वैकल्पिक दृष्टिकोण क्या मैं इस सवाल के माध्यम से करने के लिए कोशिश कर रहा हूँ रास्ता है: How can I use PListBuddy to copy an entry from one file to another?मैं प्लिस्टबड्डी का उपयोग करके एक प्लिस्ट में ऐरे कैसे जोड़ सकता हूं?

मैं एक XCode के माध्यम से PlistBuddy का उपयोग कर Plist फ़ाइल बी को Plist फ़ाइल एक से एक प्रविष्टि कॉपी करने के लिए का निर्माण स्क्रिप्ट चाहते , बैश/शैल का उपयोग कर। ऐसा करके, मैं प्लिस्टबड्डी की "कॉपी" फ़ंक्शन का उपयोग नहीं कर सकता। मुझे प्रत्येक व्यक्ति के तत्वों के साथ प्रत्येक व्यक्तिगत प्रविष्टि की प्रतिलिपि बनाना चाहिए, क्योंकि आप शब्दकोश जोड़/सेट नहीं कर सकते हैं, लेकिन "प्रविष्टियों" के माध्यम से प्लिस्टबड्डी से बातचीत करनी चाहिए।

जो मैं करने की कोशिश कर रहा हूं वह प्लिस्ट फ़ाइल ए लेता है और "PSMultiValueSpecifier" तत्व के लिए अपने टाइटल/वैल्यू एरे स्टोर करता है। मैं सरणी में तत्वों को पकड़ने और स्क्रीन पर प्रिंट करने में सक्षम हूं, लेकिन जब मैं उन्हें गंतव्य प्लेस्ट फ़ाइल बी में जोड़ने के लिए जाता हूं, तो सरणी अभी भी खाली होती है।

कोड: (कोड जोड़ने के लिए प्रवेश ले लो करने के लिए)

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

कृपया प्लिस्टबड्डी की अनियंत्रित विशेषताओं के बारे में आपको कोई जानकारी है, तो कृपया मदद करें। मैन पेज सुपर पतले हैं और उदाहरण दूर और बीच हैं।

मैं इसे पढ़ने और आपके दिमाग में इस बड़े दर्द को हल करने में मदद करने के लिए अपने दिमाग उधार देने के लिए धन्यवाद देना चाहता हूं।

+0

ऐसा करने का एक बेहतर तरीका हो सकता है, लेकिन मैंने स्रोत सरणी में तत्वों की गणना करके और फिर उन्हें व्यक्तिगत रूप से कॉपी करके इस समस्या को हल किया है। $ {PLISTBUDDY} -c "PreferenceSpecifiers जोड़ें: $ DEST_INDEX: टाइटल सरणी" $ {DEST_PLIST} $ {PLISTBUDDY} -c "PreferenceSpecifiers जोड़ें: $ DEST_INDEX: टाइटल: 0 स्ट्रिंग 'TITLE_1'" $ {DEST_PLIST} $ {PLISTBUDDY} -c "वरीयता स्पेसिफायर जोड़ें: $ 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

क्या आपने प्लिस्टबड्डी में [आयात कमांड] (http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html) देखा है? यह संबंधित लगता है, लेकिन 'प्रविष्टि' के तहत पूरी लक्ष्य फ़ाइल जोड़ता है। – Richard

+0

हाँ, मैंने आयात कमांड को देखा।ऐसा लगता है कि लक्ष्य प्रविष्टि को ओवरराइट करना है। मुझे लक्ष्य प्रविष्टि को जोड़ना/संशोधित करना था। अनिवार्य रूप से मैंने एक प्लिस्ट की सामग्री को एक हाइब्रिड प्लिस्ट फ़ाइल बनाने के लिए किसी अन्य प्लिस्ट की सामग्री के सबसेट में इंजेक्ट किया था। यह सब उन्नत डिबगिंग सेटिंग्स इत्यादि के लिए संकलन-समय निर्माण स्क्रिप्ट द्वारा किया जाता है। – jhthorp

0

यह आपकी समस्या को ठीक कर सकता है लेकिन यह बड़ी विलय स्क्रिप्ट में लागू करने का सही तरीका नहीं है। नीचे मेरा जवाब देखें।

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

तारों की एक सरणी की तरह कुछ सरल के लिए, यहां कोड है जो मनमाने ढंग से सरणी को जोड़ देगा। यह उदाहरण आईओएस जानकारी प्लिस्ट्स में सामान्य 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 
संबंधित मुद्दे

 संबंधित मुद्दे