何千ものアイテムにリンクされているコンポーネントがあります(この場合、他のすべてのアイテムはコンポーネントです)。コンポーネントを削除してすべてのリンクを削除する簡単で迅速な方法はありますか?
私は現在Tridion5.3を使用しており、TOMAPIを介してプログラムでこれを行っています。10000の他のコンポーネントにリンクされた1つのコンポーネントの場合、これには約7時間かかりました。まだまだたくさんあります!
私はR5.3から2011に移行中なので、どちらをタスクにも使用できます。
私が使用しているコードは次のとおりです...
static void Main(string[] args)
{
var componentIDToRemove = "tcm:4-123456";
var linkedComponentIDs = System.IO.File.ReadAllLines("C:\\...\\whereused.txt"); // ids of the components linked to tcm:4-123456
TDS.TDSE tdse = new TDS.TDSE();
foreach (var linkedComponentID in linkedComponentIDs)
{
TDS.Component component = null;
TDS.ItemFieldValues itemFieldValues = null;
try
{
component = (TDS.Component)tdse.GetObject(linkedComponentID, TDSDefines.EnumOpenMode.OpenModeView);
itemFieldValues = component.MetadataFields["myfield"].value;
var itemFieldValuesCount = itemFieldValues.Count;
for (var i = itemFieldValuesCount; i > 0; i--)
{
if (itemFieldValues[i].ID == componentIDToRemove)
{
component.CheckOut();
itemFieldValues.Remove(i);
component.Save();
component.CheckIn();
}
}
}
finally
{
// release the TDS objects from memory
ReleaseObject(component);
ReleaseObject(itemFieldValues);
}
}
}
public static void ReleaseObject(object o)
{
try
{
if (o != null)
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(o);
}
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}