Copy link to clipboard
Copied
Hi, this is my first post. I know this has been asked a few times in various forms but I want to describe my situation as clearly as I can. I’ve been trying to figure it out myself for a couple of days but I’m not getting anywhere. I don’t have a scripting background.
Situation:
I’m a Imaging Officer for a cultural institution. I have around 16k files that require layering as pairs – an image exposed to capture slide mount details (A) and an exposure to capture the transparency itself (B). They required capturing in this way because top lights on the transparency highlight dust and scratches, while capturing the transparency from underneath with a lightbox does not.
Each file is unflattened, the A files have a single layer called 'A' and the B files a layer called 'B'.
All files are matched in pairs in their own folders:
Automation:
I’d like to be able to automate the following:
The rest of my workflow would involve placing a layer mask over the transparency in A to reveal B.
Would it be possible to have a script work in this way? Any help would be very much appreciated.
This version recurses into all child sub-folders under the parent root/top-level folder and retrieves files matching the nominated file types.
/*
Stack N Number of Document Sets to Layers - Recursive Folders.jsx
Stephen Marsh
20th January 2023 Version
A generic, skeleton "framework" script to help fast-track development of similar scripts for combining multiple "sequence" single-layer files to layers.
This script will recurse into all sub-folders under the main top-level/root input folder.
...
Copy link to clipboard
Copied
@Russell_P - I have posted multiple variations of scripts for layering pairs or sets using three or more images, either from single or multiple separate input folders.
<Edit: Incorrect link removed>
Copy link to clipboard
Copied
My script template only looks at the root/top-level input folder... It doesn't recurse into sub-folders.
That would need to be changed, or you run one pair's sub-folder at a time, which isn't great.
Copy link to clipboard
Copied
Thanks @Stephen_A_Marsh for the framework script. It's a good start for me to dive deeper.
Yes, running things one sub-folder at a time is not ideal. I'll let you know how I get along in the coming days.
Copy link to clipboard
Copied
As all the files have unique names, you could copy them all out to a single top level root folder for processing, then move the final combined files back to where you need them. Again not ideal, but it would get the job done if in a hurry.
The script is generic and generally requires modifications as each use case is usually unique... It is usually a case of what has to happen to the layer pairs when stacked and the filenaming and file format.
<Edit: Incorrect link removed>
I'll check the code later and post a more suitable version if needed, it is no fun doing this on a phone!
Copy link to clipboard
Copied
Thanks @Stephen_A_Marsh for the framework script. It's a good start for me to dive deeper.
Yes, running things one sub-folder at a time is not ideal. I'll let you know how I get along in the coming days.
By @Russell_P
Russell, I now have a working version to recurse into all sub-folders under the main top-level/root input folder... Are you still interested?
Copy link to clipboard
Copied
@Russell_P – EDIT; Here is the most up-to-date version:
/*
Stack N Number of Document Sets to Layers - Top Level Folder.jsx
Stephen Marsh
20th January 2023 Version
A generic, skeleton "framework" script to help fast-track development of similar scripts for combining multiple "sequence" single-layer files to layers.
This script requires input files from a single folder to be alpha/numeric sorting in order to stack in the correct set quantity.
Example: File-01.jpg File-02.jpg etc, FileA1.tif FileA2.tif etc, File1a.tif File1b.tif etc.
A minimum of 2 or more files per stack is required. The quantity of input files must be evenly divisible by the stack quantity.
A named action set and action can be set on line 139 to "do something" with the stacked layers.
*/
#target photoshop
// app.documents.length === 0
if (!app.documents.length) {
try {
// Save and disable dialogs
var restoreDialogMode = app.displayDialogs;
app.displayDialogs = DialogModes.NO;
// Main script function
(function () {
// Select the input folder
var inputFolder = Folder.selectDialog('Please select the folder with files to process');
if (inputFolder === null) return;
// Limit the file format input, add or remove as required
var fileList = inputFolder.getFiles(/\.(png|jpg|jpeg|tif|tiff|psd|psb)$/i);
// Force alpha-numeric list sort
// Use .reverse() for the first filename in the merged file
// Remove .reverse() for the last filename in the merged file
fileList.sort().reverse();
//////////////////////////// Static Set Quantity - No GUI ////////////////////////////
// var setQty = 2;
//////////////////////////////////////////////////////////////////////////////////////
// or...
//////////////////////////// Variable Set Quantity - GUI /////////////////////////////
// Loop the input prompt until a number is entered
var origInput;
while (isNaN(origInput = prompt('No. of files per set (minimum 2):', '2')));
// Test if cancel returns null, then terminate the script
if (origInput === null) {
alert('Script cancelled!');
return
}
// Test if an empty string is returned, then terminate the script
if (origInput === '') {
alert('A value was not entered, script cancelled!');
return
}
// Test if a value less than 2 is returned, then terminate the script
if (origInput < 2) {
alert('A value less than 2 was entered, script cancelled!');
return
}
// Convert decimal input to integer
var setQty = parseInt(origInput);
//////////////////////////////////////////////////////////////////////////////////////
// Validate that the file list is not empty
var inputCount = fileList.length;
var cancelScript1 = (inputCount === 0);
if (cancelScript1 === true) {
alert('Zero input files found, script cancelled!');
return;
}
// Validate the input count vs. output count - Thanks to Kukurykus for the advice to test using % modulus
var cancelScript2 = !(inputCount % setQty);
alert(inputCount + ' input files stacked into sets of ' + setQty + ' will produce ' + inputCount / setQty + ' output files.');
// Test if false, then terminate the script
if (cancelScript2 === false) {
alert('Script cancelled as the quantity of input files are not evenly divisible by the set quantity.');
return;
}
// Select the output folder
var outputFolder = Folder.selectDialog("Please select the folder to save to");
if (outputFolder === null) {
alert('Script cancelled!');
return;
}
// or
/*
// Create the output sub-directory
var outputFolder = Folder(decodeURI(inputFolder + '/Output Sets Folder'));
if (!outputFolder.exists) outputFolder.create();
*/
// Set the file processing counter
var fileCounter = 0;
// Loop through and open the file sets
while (fileList.length) {
// Sets of N quantity files
for (var a = 0; a < setQty; a++) {
try {
app.open(fileList.pop());
} catch (e) { }
}
// Set the base doc layer name
app.activeDocument = documents[0];
docNameToLayerName();
// Stack all open docs to the base doc
while (app.documents.length > 1) {
app.activeDocument = documents[1];
docNameToLayerName();
app.activeDocument.activeLayer.duplicate(documents[0]);
app.activeDocument = documents[0];
// Do something to the stacked active layer (blend mode, opacity etc)
// app.activeDocument.activeLayer.blendMode = BlendMode.MULTIPLY;
app.documents[1].close(SaveOptions.DONOTSAVECHANGES);
}
////////////////////////////////// Start doing stuff //////////////////////////////////
/*
// Run an action on the stacked layers, change the case-sensitive names as required...
try {
app.doAction("My Action", "My Action Set Folder");
} catch (e) { }
*/
/*
// Average stacked layers
app.runMenuItem(stringIDToTypeID("selectAllLayers"));
var idnewPlacedLayer = stringIDToTypeID("newPlacedLayer");
executeAction(idnewPlacedLayer, undefined, DialogModes.NO);
var idapplyImageStackPluginRenderer = stringIDToTypeID("applyImageStackPluginRenderer");
var desc1217 = new ActionDescriptor();
var idimageStackPlugin = stringIDToTypeID("imageStackPlugin");
var idavrg = charIDToTypeID("avrg");
desc1217.putClass(idimageStackPlugin, idavrg);
var idname = stringIDToTypeID("name");
desc1217.putString(idname, """Mean""");
executeAction(idapplyImageStackPluginRenderer, desc1217, DialogModes.NO);
*/
////////////////////////////////// Finish doing stuff //////////////////////////////////
// Delete XMP metadata to reduce final file size of output files
removeXMP();
// Save name + suffix & save path
var Name = app.activeDocument.name.replace(/\.[^\.]+$/, '');
var saveFile = File(outputFolder + '/' + Name + '_x' + setQty + '-Sets' + '.psd');
// var saveFile = File(outputFolder + '/' + Name + '_x' + setQty + '-Sets' + '.jpg');
// Call the save function
savePSD(saveFile);
//saveTIFF(saveFile);
//saveJPEG(saveFile);
//savePNG(saveFile);
// Close all open files without saving
while (app.documents.length) {
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
// Increment the file saving counter
fileCounter++;
///// Functions /////
function savePSD(saveFile) {
psdSaveOptions = new PhotoshopSaveOptions();
psdSaveOptions.embedColorProfile = true;
psdSaveOptions.alphaChannels = true;
psdSaveOptions.layers = true;
psdSaveOptions.annotations = true;
psdSaveOptions.spotColors = true;
// Save as
app.activeDocument.saveAs(saveFile, psdSaveOptions, true, Extension.LOWERCASE);
}
/* Not currently used, a placeholder to swap in/out as needed
function saveTIFF(saveFile) {
tiffSaveOptions = new TiffSaveOptions();
tiffSaveOptions.embedColorProfile = true;
tiffSaveOptions.byteOrder = ByteOrder.IBM;
tiffSaveOptions.transparency = true;
// Change layers to false to save without layers
tiffSaveOptions.layers = true;
tiffSaveOptions.layerCompression = LayerCompression.ZIP;
tiffSaveOptions.interleaveChannels = true;
tiffSaveOptions.alphaChannels = true;
tiffSaveOptions.annotations = true;
tiffSaveOptions.spotColors = true;
tiffSaveOptions.saveImagePyramid = false;
// Image compression = NONE | JPEG | TIFFLZW | TIFFZIP
tiffSaveOptions.imageCompression = TIFFEncoding.TIFFLZW;
// Save as
app.activeDocument.saveAs(saveFile, tiffSaveOptions, true, Extension.LOWERCASE);
}
*/
/* Not currently used, a placeholder to swap in/out as needed
function saveJPEG(saveFile) {
jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.embedColorProfile = true;
jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
jpgSaveOptions.matte = MatteType.NONE;
jpgSaveOptions.quality = 10;
// Save as
activeDocument.saveAs(saveFile, jpgSaveOptions, true, Extension.LOWERCASE);
}
*/
/* Not currently used, a placeholder to swap in/out as needed
function savePNG(saveFile) {
var pngOptions = new PNGSaveOptions();
pngOptions.compression = 0; // 0-9
pngOptions.interlaced = false;
// Save as
app.activeDocument.saveAs(saveFile, pngOptions, true, Extension.LOWERCASE);
}
*/
function docNameToLayerName() {
var layerName = app.activeDocument.name.replace(/\.[^\.]+$/, '');
app.activeDocument.activeLayer.name = layerName;
}
function removeXMP() {
if (!documents.length) return;
if (ExternalObject.AdobeXMPScript == undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(activeDocument.xmpMetadata.rawData);
XMPUtils.removeProperties(xmp, "", "", XMPConst.REMOVE_ALL_PROPERTIES);
app.activeDocument.xmpMetadata.rawData = xmp.serialize();
}
}
// Restore saved dialogs
app.displayDialogs = restoreDialogMode;
// End of script notification
app.beep();
alert('Script completed!' + '\n' + fileCounter + ' combined files saved to:' + '\n' + outputFolder.fsName);
// Open the output folder in the Finder or Explorer
// outputFolder.execute();
}());
} catch (e) {
// Restore saved dialogs
app.displayDialogs = restoreDialogMode;
alert("If you see this message, something went wrong!" + "\r" + e + ' ' + e.line);
}
}
else {
alert('Stack "N" Number of Sets:' + '\n' + 'Please close all open documents before running this script!');
}
Copy link to clipboard
Copied
@Russell_P – Sorry about the two incorrect links, have you had time to try the script posted above?
Just to process a single subfolder to evaluate the stacking. You can reference an action set/action to play in the script once the two files are stacked...
I'll help to make adjustments to the script based on your feedback as this is just a "start point".
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html
Copy link to clipboard
Copied
This version recurses into all child sub-folders under the parent root/top-level folder and retrieves files matching the nominated file types.
/*
Stack N Number of Document Sets to Layers - Recursive Folders.jsx
Stephen Marsh
20th January 2023 Version
A generic, skeleton "framework" script to help fast-track development of similar scripts for combining multiple "sequence" single-layer files to layers.
This script will recurse into all sub-folders under the main top-level/root input folder.
Input files must be alpha/numeric sorting in order to stack in the correct set quantity.
Example: File-01.jpg File-02.jpg etc, FileA1.tif FileA2.tif etc, File1a.tif File1b.tif etc.
A minimum of 2 or more files per stack is required. The quantity of input files must be evenly divisible by the stack quantity.
A named action set and action can be set on line 165 to "do something" with the stacked layers.
*/
#target photoshop
// app.documents.length === 0
if (!app.documents.length) {
try {
// Save and disable dialogs
var restoreDialogMode = app.displayDialogs;
app.displayDialogs = DialogModes.NO;
// Main script function
(function () {
// Select the input folder
var inputFolder = Folder.selectDialog('Please select the top-level/root folder with sub-folders/files to process');
if (inputFolder === null) return;
// Limit the file format input, add or remove as required
var filesAndFolders = scanSubFolders(inputFolder, /\.(png|jpg|jpeg|tif|tiff|psd|psb)$/i);
// Set the recursive folder's files
var fileList = filesAndFolders[0];
// Recursive folder and file selection
// Function parameters: folder object, RegExp or string
function scanSubFolders(tFolder, mask) {
/*
Adapted from:
https://community.adobe.com/t5/photoshop-ecosystem-discussions/photoshop-javascript-open-files-in-all-subfolders/m-p/5162230
*/
var sFolders = [];
var allFiles = [];
sFolders[0] = tFolder;
// Loop through folders
for (var j = 0; j < sFolders.length; j++) {
var procFiles = sFolders[j].getFiles();
// Loop through this folder contents
for (var i = 0; i < procFiles.length; i++) {
if (procFiles[i] instanceof File) {
if (mask == undefined) {
// If no search mask collect all files
allFiles.push(procFiles);
}
if (procFiles[i].fullName.search(mask) != -1) {
// Otherwise only those that match mask
allFiles.push(procFiles[i]);
}
} else if (procFiles[i] instanceof Folder) {
// Store the subfolder
sFolders.push(procFiles[i]);
// Search the subfolder
scanSubFolders(procFiles[i], mask);
}
}
}
return [allFiles];
}
// Force alpha-numeric list sort
// Use .reverse() for the first filename in the merged file
// Remove .reverse() for the last filename in the merged file
fileList.sort().reverse();
//////////////////////////// Static Set Quantity - No GUI ////////////////////////////
// var setQty = 2;
//////////////////////////////////////////////////////////////////////////////////////
// or...
//////////////////////////// Variable Set Quantity - GUI /////////////////////////////
// Loop the input prompt until a number is entered
var origInput;
while (isNaN(origInput = prompt('No. of files per set (minimum 2):', '2')));
// Test if cancel returns null, then terminate the script
if (origInput === null) {
alert('Script cancelled!');
return
}
// Test if an empty string is returned, then terminate the script
if (origInput === '') {
alert('A value was not entered, script cancelled!');
return
}
// Test if a value less than 2 is returned, then terminate the script
if (origInput < 2) {
alert('A value less than 2 was entered, script cancelled!');
return
}
// Convert decimal input to integer
var setQty = parseInt(origInput);
//////////////////////////////////////////////////////////////////////////////////////
// Validate that the file list is not empty
var inputCount = fileList.length;
var cancelScript1 = (inputCount === 0);
if (cancelScript1 === true) {
alert('Zero input files found, script cancelled!');
return;
}
// Validate the input count vs. output count - Thanks to Kukurykus for the advice to test using % modulus
var cancelScript2 = !(inputCount % setQty);
alert(inputCount + ' input files stacked into sets of ' + setQty + ' will produce ' + inputCount / setQty + ' output files.');
// Test if false, then terminate the script
if (cancelScript2 === false) {
alert('Script cancelled as the quantity of input files are not evenly divisible by the set quantity.');
return;
}
// Set the file processing counter
var fileCounter = 0;
// Loop through and open the file sets
while (fileList.length) {
// Sets of N quantity files
for (var a = 0; a < setQty; a++) {
try {
app.open(fileList.pop());
} catch (e) { }
}
// Set the base doc layer name
app.activeDocument = documents[0];
docNameToLayerName();
// Set the save path back to the source/input sub-folder
var outputFolder = documents[0].path;
// Stack all open docs to the base doc
while (app.documents.length > 1) {
app.activeDocument = documents[1];
docNameToLayerName();
app.activeDocument.activeLayer.duplicate(documents[0]);
app.activeDocument = documents[0];
// Do something to the stacked active layer (blend mode, opacity etc)
// app.activeDocument.activeLayer.blendMode = BlendMode.MULTIPLY;
app.documents[1].close(SaveOptions.DONOTSAVECHANGES);
}
////////////////////////////////// Start doing stuff //////////////////////////////////
/*
// Run an action on the stacked layers, change the case-sensitive names as required...
try {
app.doAction("My Action", "My Action Set Folder");
} catch (e) {
alert(e + ' ' + e.line);
}
*/
////////////////////////////////// Finish doing stuff //////////////////////////////////
// Delete XMP metadata to reduce final file size of output files
removeXMP();
// Save name + suffix & save path
var Name = app.activeDocument.name.replace(/\.[^\.]+$/, '');
var saveFile = File(outputFolder + '/' + Name + '_x' + setQty + '-Sets' + '.psd');
// var saveFile = File(outputFolder + '/' + Name + '_x' + setQty + '-Sets' + '.tif');
// var saveFile = File(outputFolder + '/' + Name + '_x' + setQty + '-Sets' + '.jpg');
// var saveFile = File(outputFolder + '/' + Name + '_x' + setQty + '-Sets' + '.png');
// Call the save function
savePSD(saveFile);
//saveTIFF(saveFile);
//saveJPEG(saveFile);
//savePNG(saveFile);
// Close all open files without saving
while (app.documents.length) {
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
// Increment the file saving counter
fileCounter++;
///// Functions /////
function savePSD(saveFile) {
psdSaveOptions = new PhotoshopSaveOptions();
psdSaveOptions.embedColorProfile = true;
psdSaveOptions.alphaChannels = true;
psdSaveOptions.layers = true;
psdSaveOptions.annotations = true;
psdSaveOptions.spotColors = true;
// Save as
app.activeDocument.saveAs(saveFile, psdSaveOptions, true, Extension.LOWERCASE);
}
/* Not currently used, a placeholder to swap in/out as needed
function saveTIFF(saveFile) {
tiffSaveOptions = new TiffSaveOptions();
tiffSaveOptions.embedColorProfile = true;
tiffSaveOptions.byteOrder = ByteOrder.IBM;
tiffSaveOptions.transparency = true;
// Change layers to false to save without layers
tiffSaveOptions.layers = true;
tiffSaveOptions.layerCompression = LayerCompression.ZIP;
tiffSaveOptions.interleaveChannels = true;
tiffSaveOptions.alphaChannels = true;
tiffSaveOptions.annotations = true;
tiffSaveOptions.spotColors = true;
tiffSaveOptions.saveImagePyramid = false;
// Image compression = NONE | JPEG | TIFFLZW | TIFFZIP
tiffSaveOptions.imageCompression = TIFFEncoding.TIFFLZW;
// Save as
app.activeDocument.saveAs(saveFile, tiffSaveOptions, true, Extension.LOWERCASE);
}
*/
/* Not currently used, a placeholder to swap in/out as needed
function saveJPEG(saveFile) {
jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.embedColorProfile = true;
jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
jpgSaveOptions.matte = MatteType.NONE;
jpgSaveOptions.quality = 10;
// Save as
activeDocument.saveAs(saveFile, jpgSaveOptions, true, Extension.LOWERCASE);
}
*/
/* Not currently used, a placeholder to swap in/out as needed
function savePNG(saveFile) {
var pngOptions = new PNGSaveOptions();
pngOptions.compression = 0; // 0-9
pngOptions.interlaced = false;
// Save as
app.activeDocument.saveAs(saveFile, pngOptions, true, Extension.LOWERCASE);
}
*/
function docNameToLayerName() {
var layerName = app.activeDocument.name.replace(/\.[^\.]+$/, '');
app.activeDocument.activeLayer.name = layerName;
}
function removeXMP() {
if (!documents.length) return;
if (ExternalObject.AdobeXMPScript == undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");
var xmp = new XMPMeta(activeDocument.xmpMetadata.rawData);
XMPUtils.removeProperties(xmp, "", "", XMPConst.REMOVE_ALL_PROPERTIES);
app.activeDocument.xmpMetadata.rawData = xmp.serialize();
}
}
// Restore saved dialogs
app.displayDialogs = restoreDialogMode;
// End of script notification
app.beep();
alert('Script completed!' + '\n' + fileCounter + ' combined files saved to their respective source folders in:' + '\n' + outputFolder.parent.fsName);
}());
} catch (e) {
// Restore saved dialogs
app.displayDialogs = restoreDialogMode;
alert("If you see this message, something went wrong!" + "\r" + e + ' ' + e.line);
}
}
else {
alert('Stack "N" Number of Sets:' + '\n' + 'Please close all open documents before running this script!');
}
Copy link to clipboard
Copied
Hi @Stephen_A_Marsh ,
Amazing, thank you for having a look into this. Apologies, I've been on leave. I will dive back into all of this and let you know how we get on. Thanks for your time and effort.
Copy link to clipboard
Copied
@Stephen_A_Marsh - This has done exactly what I required. You've just saved me a great deal of time and effort. I appreciate your willingness to look further into the issue and develop the workaround.
Many thanks,
Russell
Copy link to clipboard
Copied
@Russell_P – You’re welcome, I wasn't sure if you were returning, so I am happy that you did.
Copy link to clipboard
Copied
Stephan,
Thankyou for this script. Currently I have an issue.
try { app.doAction("My Action", "My Action Set Folder"); } catch (e) { alert(e + ' ' + e.line); }
I have replaced myaction and myaction set folder, however it does not work. I spent last night, but after researching and reading, trying , I keep getting the error "play is not available in this photoshop.
I am using the latest one.
For example If my action is Named "One" and the action set is "overlay"
try { app.doAction("One", "overlay"); } catch (e) { alert(e + ' ' + e.line); }
-----------------------------------------------------------
Also how would I save the new files to a different folder. ?
Again as the user above I have 1K+ images, and after they are merged and an action is applied, I would like it to be saved into a new folder, from that I can add another set of batch settings.
Thank you
Copy link to clipboard
Copied
Is the action set and action available in the Action panel? Have you tried swapping things around in the code, just in case you have the set and action in the wrong place? Case sensitive?
As I don't know your scripting knowledge, did you remove the multi-line commenting surrounding the code block (indicated in red below)?
There are three common variations for a script to play an action. The first two are just variations on the same DOM code. The third option is AM code wrapped in a function with parameters for ease of use, so perhaps try that.
You shouldn't need the .atn extension, it's there to make it clear which is the action and which is the action set in the code.
app.doAction("Molten Lead","Default Actions.atn");
or
var actionName = "Molten Lead"; // Action to run
var actionSet = "Default Actions.atn"; // Action set to run
app.doAction(actionName,actionSet);
or
playAction ('Default Actions', 'Molten Lead')
function playAction(actionSet, actionName){
var idPly = charIDToTypeID( "Ply " );
var desc2 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var idActn = charIDToTypeID( "Actn" );
ref1.putName( idActn, actionSet );
var idASet = charIDToTypeID( "ASet" );
ref1.putName( idASet, actionName );
desc2.putReference( idnull, ref1 );
executeAction( idPly, desc2, DialogModes.NO );
}
Copy link to clipboard
Copied
hi Stephen,
Code worked -
Yes, I did edit your code to get it to save as Tiff and I did remove the slashes.
Yes Actions are saved and exist within the Actions Folder and visible in the Actions dialogue.
At first I did notice there were Case sensitive issues, which I resolved and still had the same issue.
-----------------------------------------------------------------------------------------------
I went through all three codes steps -
The last one worked.
I then went back to the first code and reversed it as you mentioned and that worked too, as it is also shorter
I am writing it, incase it may help someone to understand it.
The final code would be
app.doAction("Molten Lead","Default Actions.atn"); /*<-- what was written originally
app.doAction("Default Actions.atn","Molten Lead"); /* <-- this worked. Reversed
Molten lead = Action Folder name/label
Default Actions.atn = Actual Action within the Folder Label
I am not attempting to fix the output folder. Will get back to you.
Thankyou
Copy link to clipboard
Copied
app.doAction("Molten Lead","Default Actions.atn"); //<-- what was written originally
app.doAction("Default Actions.atn","Molten Lead"); //<-- this worked. Reversed
Molten lead = Action Folder name/label
Default Actions.atn = Actual Action within the Folder Label
Now attempting to fix the output folder.
Copy link to clipboard
Copied
This image is from an old post... The action set (folder or .atn file) is called "Chakras", while the action contained within the set is called "Chakra1 - Root". You can see how the action panel corresponds to the code, red for the action set and green for the action within the set:
Copy link to clipboard
Copied
Also how would I save the new files to a different folder. ?
By @thalict
You can change the following line from:
var outputFolder = documents[0].path;
To a static path, such as a folder titled My Folder on the desktop:
var outputFolder = new Folder('~/desktop/My Folder');
Or you can prompt for a variable location:
var outputFolder = Folder.selectDialog("Please select the folder to save to");
Copy link to clipboard
Copied
hi
var outputFolder = Folder.selectDialog("Please select the folder to save to");
This code - interrupts after each folder is processed , and its not a workable solution if one requires automation.
the other codes give me a disk error
var outputFolder = ("F:/Images/output");
Adding brackets worked, but at the end of the process it gave me some error at line 287.
No sure what it is yet.
Thankyou
Copy link to clipboard
Copied
This code - interrupts after each folder is processed , and its not a workable solution if one requires automation.
By @Thalict2
Apologies, I didn't check where the outputFolder variable was placed in the original script.
In the original script, it was in a loop, automatically saving to the variable input file location, which were in different subfolders.
For your repurposing of the code, you should remove it from the loop and add it after the inputFolder variable, which is not in a loop and will therefore only prompt once.
___________
Again, my bad on the static path, I missed the parenthesis, I have updated my example.
var outputFolder = new Folder('~/desktop/My Folder');
I usually script on the Mac, so I can never remember the exact system requirements for Windows.
I think that you can do without the uppercase and colon, using JS forward slashes:
var outputFolder = ("f/Images/output");
Or using escaped double-backslashes for Windows directory path separators:
var outputFolder = ("f:\\Images\\output");