Function to repeat a command in all subfolders of a parent folder

This is a little utility function for interactive analysis of repetitive data sets stored in subfolders.
When you just want to quickly repeat a simple command on all your data without writing a procedure.
//===================================================================================================================
// Function DoAllFolders
// Version 1.0.3
// Created : 2014-07-24
// Last Modified : 2016-01-07
// Input    :   A command string typically copied from the history window
// Calls    :  
// Returns  :   -1 if procedure does not complete. Nothing if it finishes
// Output   :   Executes the command string on all subfolders in the current folder. 1 level deep (does not recurse)
// Requires :   Because of the use of the DFR type, Igor 6.1 or higher is required.
// The purpose of this function is to allow exploratory data analysis on repetitive data sets stored in separate data folders.
// Typically this gets invoked after performing an operation on one data set that should then be repeated on all others.
// The command may be copied from the history window or command line and pasted into the prompt displayed by the function
// The command needs to be called from the parent folder
// The operation is then invoked on all subfolders using the "Execute" command
// All subfolders should have identically structured data (or at least should have the data structures used by the command)
// Also, the command will be executed in all folders, including the one that had the original operation. For some functions it may be necessary to set
//      flags to allow overwriting of variables/string/waves created by the original operation.
// The command string must be entered in string syntax, i.e. quotes and backslashes must be escaped using \
// Revision history
//  1.0.1 : Turned on Preferences before executing the command, so things behave more as if executed from the Command Line (especially graphs)
//  1.0.2:  Added reference to parent folder into the reporting string at the end of the routine. That way the history shows where the command was executed.
//  1.0.3   2016-01-07  :   Made the Command String a parameter to the function, so it can be passed as a call. Which means that now you can make a menu entry
//                              that runs a canned command over a set of folders. Slick.
//===================================================================================================================

Function DoAllFolders(CommandString)
    String CommandString    //The Command to be executed for each folder
    DFREF HomeFolder        //Starting folder reference
    HomeFolder = GetDataFolderDFR()     //Save the starting folder
   
    //Count the number of subfolders
    Variable FolderCount = CountObjectsDFR(HomeFolder,4)    //return the number of datafolders
    if (FolderCount < 1)        //Check that there are subfolders
        Print "Error: No subfolders to process"
        return -1
    endif
   
    //We have some subfolders to process, so now get the command to execute

    if(stringmatch(CommandString,""))       //If an empty string was passed, we prompt for the command
        Prompt CommandString, "Command:"
        DoPrompt "Enter the Command to be Executed" CommandString       //Prompt for the Command String. Note that this requires "\" escape codes for all special characters
        if (strlen(CommandString) ==0)          //If no command was entered, treat it as if the user canceled (set V_Flag to 1)
            V_Flag = 1
        endif
        if (V_Flag)
            Print "No Command entered"
            return -1 // User canceled
        endif
    endif
   
    //Turn on Preferences so all commands are executed as if from the Command line
    Preferences 1
   
    //Traverse the subfolders and execute the Command in each
    //If the command is buggy, the routine will error at execution
    Variable i  = 0 //index variable for loop
    String CurrentFolder    //Set a string variable for the current folder name
   
    do
        CurrentFolder = GetIndexedObjNameDFR(HomeFolder, 4, i)      //Pick the current subfolder
        SetDataFolder CurrentFolder
        Execute/Q CommandString     //Execute the Command string as if it had been entered on the command line. Do not echo to history
        SetDataFolder HomeFolder        //Return to starting folder
        i +=1                       //Advance to the next folder
    while (i < FolderCount)             // as long as expression is TRUE

    //Now print a message to the history window so we can track what happened since we suppressed history for the Execute command
    Printf "Executed Command '%s' in %g subfolders of '%s'\r",  CommandString, FolderCount , GetDataFolder(0)

End

Forum

Support

Gallery

Igor Pro 9

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More