Duplicate Button

Try this (be careful as it also duplicates folders) as a script button.
DuplicateNumber.dcf (4.8 KB)

function OnClick(clickData)
{
	var cmd = clickData.func.command;
	var fsu = DOpus.FSUtil;
	cmd.deselect = false; // Prevent automatic deselection
	// --------------------------------------------------------
	cmd.RunCommand("Set VIEW=Details");
	var duplicateCmd = DOpus.Create.Command();
	duplicateCmd.SetSourceTab(clickData.func.sourcetab);
	duplicateCmd.SetDestTab(clickData.func.sourcetab);
	// --------------------------------------------------------
	DOpus.Output("Selected items in " + clickData.func.sourcetab.path + ":");
	if (clickData.func.sourcetab.selected.count == 0)
	{
		DOpus.Output("No selection. Aborting.");
	}

	var allTargetNames = DOpus.Create.Map();
	for (var e = new Enumerator(clickData.func.sourcetab.selected); !e.atEnd(); e.moveNext())
	{
		var item = e.item();

		dout("item name : " + item.name_stem_m);
		
		// Define default target duplicate name
		var targetName = GetNextName(item.name_stem_m);
		var fullTargetName = item.path + "\\" + targetName + item.ext_m;
//		dout("full target = '" + fullTargetName + "'");

		while (fsu.Exists(fullTargetName) || allTargetNames.Exists(fullTargetName)) {
			//dout("fsu : already exists");
			targetName = GetNextName(targetName);
			fullTargetName = item.path + "\\" + targetName + item.ext_m;
			//dout(" => Needs to try '" + fullTargetName + "'");
		}
		allTargetNames(fullTargetName) = 1;
//		dout("## Target '" + fullTargetName + "' added to the map");

		// Build command
		var unitCmd = 'Copy "' + item + '" AS "' + targetName + item.ext_m + '"';
		dout("cmd line = #" + unitCmd + "#");
		duplicateCmd.AddLine(unitCmd);
		
	}

	duplicateCmd.Run();

}

function GetNextName(name) {
	var endingNumber = 1;
	var targetName = name + " " + endingNumber;
	
	var regex = new RegExp(" ([0-9]+)$", "g");

	var match = regex.exec(name);
	if (match !== null && match.length == 2) {
		//dout("Item ends with a number (" + match[1] + ")");
		endingNumber = +match[1] + 1;
		//dout ("NEW Ending Number = " + endingNumber);
		targetName = name.replace(regex, " " + endingNumber);
	}

	//dout ("Target Name = '" + targetName + "'");
	return targetName;

}

function dout(msg, error, time) {
	if (error == undefined) error = false;
	if (time == undefined) time = true;
	DOpus.output(msg, error, time);
}

1 Like