The script plugins for batch files and powershell files are consolidated into one script plugin, which also adds python script files.
The new plugin is available from the plugins option in cPicture.
Note: The old plugins are still valid, but should be removed as they cause duplicate entries (delete cpp_bat_script.dll and cpp_ps1_script.dll in the plugins folder).

github src

Example batch script

@echo OFF

echo file=%1
echo name=%2
echo dir=%3
echo width=%4
echo height=%5
echo sequence number=%6 
echo number of files=%7

REM wait for user to close the console
pause


Example PowerShell script

<#
.DESCRIPTION
    Example PowerShell script to print the picture data

.NOTES
    This example is using the default cPicture custom data template
    for the $picture_data.cdata value.
    This value can be changed in the Settings (F9).
    The .DESCRIPTION text is used for the menu tooltip.
#>

# plugin variables
# Do not remove the leading # of the variable #[...]:

# console=true (default) displays a console, use this option for scripts with text output.
#[console=true]

# noexit=true keeps the console open, set to 'false' (default) to have the console closed when processing is done. This variable is only used when #[console=true].
#[noexit=false]

param
(
    [Parameter(Mandatory=$true)]
    [string]$picture_data_json
)

# Get the picture data.
$picture_data_set = ConvertFrom-Json -InputObject $picture_data_json

# Print the number of pictures.
[int]$size = $picture_data_set.length
Write-Host "$size picture(s):" -ForegroundColor White
Write-Host ("-" * 15)
Write-Host

# Print the picture data.
[int]$i = 1
foreach ($picture_data in $picture_data_set) {
    # Example:
    # $picture_data.file   : c:\Bilder\bild1.jpg
    # $picture_data.name   : bild1.jpg
    # $picture_data.dir    : c:\Bilder\
    # $picture_data.width  : 3712
    # $picture_data.height : 5568

    # $picture_data.audio        : false
    # $picture_data.video        : false
    # $picture_data.colorprofile : false
    # $picture_data.gps          : N 47° 37' 0,872498" W 122° 19' 32,021484"
    # $picture_data.aperture     : 5.6   # f/5.6
    # $picture_data.shutterspeed : 1250  # 1/1250s
    # $picture_data.iso          : 100
    # $picture_data.exifdate     : 133553225690000000
    # $picture_data.exifdate_str : 19.03.2024 11:49:29
    # $picture_data.model        : NIKON Z 30 
    # $picture_data.lens         : 16-50mm f/3,5-6,3 VR f=44mm/66mm
    # $picture_data.cdata        :  # Configurable with F9
    # name               : Pike-Place-Market-Kreuzung-360x180.jpg
    # dir                : C:\Bilder\
    # size               : 1624x812 Bildpunkte
    # model              : [NIKON Z 30]
    # settings           : 1/1250s ISO 100/21°
    # contains           : Kommentar, XMP, Farbprofil,
    # gps                : N 47° 37' 0,872498" W 122° 19' 32,021484"
    # file_size          : 835 KB (855189 Bytes)
    # file_create_date   : Dienstag, 19. März 2024 um 11:49:29 Uhr
    # file_modified_date : Dienstag, 19. März 2024 um 11:49:29 Uhr
    # exif_date          : Dienstag, 19. März 2024 um 11:49:29 Uhr

    [int]$MP = $picture_data.width * $picture_data.height / 1000000
    "Picture '{0}' ({4} of {5}) with {1}x{2} pixel ({3}MP)" -f $picture_data.file, $picture_data.width, $picture_data.height, $MP, $i, $size
    "  name='$($picture_data.name)', dir='$($picture_data.dir)'`n"

    # Enumerate all data fields.
    foreach ($data in $picture_data.PSObject.Properties) {
        Write-Host "  $($data.Name)" -ForegroundColor Green -NoNewline
        Write-Host ": " -NoNewline
        Write-Host "$($data.Value)" -ForegroundColor Blue
    }

    <# 
        Use ConvertFrom-Json when cdata is a json array to access the data elements.
        Otherwise cdata is arbitrary text and use $picture_data.cdata as a string, for example: Write-Host $picture_data.cdata
    #>

    # The default setting for the data is a JSON array matching the tooltip data in cPicture.
    $cdata = ConvertFrom-Json -InputObject $picture_data.cdata

    # Example usage:

    # Use specific data field.
    Write-Host $cdata.model -ForegroundColor Yellow

    # Enumerate all data fields.
    Write-Host "$($cdata.psobject.properties.Value.Count) elements in `$picture_data.cdata:"
    foreach ($data in $cdata.psobject.properties) {
        Write-Host "  $($data.Name)" -ForegroundColor Green -NoNewline
        Write-Host ": " -NoNewline
        Write-Host "$($data.Value)" -ForegroundColor Blue
    }

    "-" * 70

    $i++
}


# Use this to pause the console when using the #[console=true] option.
# Do not use when #[console=false] as the console is not displayed.
Write-Host "Press any key to continue ..."
[void]$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")


Example Python script

"""
Description: Example python script to print the picture data
"""

# plugin variables
# Do not remove the leading # of the variable #[...]:

# console=true (default) displays a console, use this option for scripts with text output.
#[console=true]

# noexit=true keeps the console open, set to 'false' (default) to have the console closed when processing is done. This variable is only used when #[console=true].
#[noexit=true]

import json
import sys
import base64

COLORS = {
    "red": "\033[31m",
    "green": "\033[32m",
    "yellow": "\033[33m",
    "blue": "\033[34m",
    "magenta": "\033[35m",
    "cyan": "\033[36m",
    "white": "\033[37m",
    "reset": "\033[0m"
}

def colored_text(text, color):
    return f"{COLORS.get(color, COLORS['reset'])}{text}{COLORS['reset']}"

# Get the picture data.
def picture_data(base64_string):

    # Decode base64 string
    json_string = base64.b64decode(base64_string).decode('utf-8').rstrip('\0')

    # Parse JSON string
    data = json.loads(json_string)

    # Print the number of pictures.
    print(f"{len(data)} picture(s): {"-" * 15}")
    print()

    # Print the picture data for each selected picture.
    for i, item in enumerate(data):

        # Example:
        # item["file"]   : c:\Bilder\bild1.jpg
        # item["name"]   : bild1.jpg
        # item["dir"]    : c:\Bilder\
        # item["width"]  : 3712
        # item["height"] : 5568

        # item["audio"]        : false
        # item["video"]        : false
        # item["colorprofile"] : false
        # item["gps"]          : N 47° 37' 0,872498" W 122° 19' 32,021484"
        # item["aperture"]     : 5.6   # f/5.6
        # item["shutterspeed"] : 1250  # 1/1250s
        # item["iso"]          : 100
        # item["exifdate"]     : 133553225690000000
        # item["exifdate_str"] : 19.03.2024 11:49:29
        # item["model"]        : NIKON Z 30 
        # item["lens"]         : 16-50mm f/3,5-6,3 VR f=44mm/66mm
        # item["cdata"]        :  # Configurable with F9
            
        print(colored_text(f"Picture {i+1}:", "yellow"))

        mp = int(item["width"] * item["height"] / 1000000)
        print(f"Picture '{item["file"]}' ({i+1} of {len(data)}) with {item["width"]}x{item["height"]} pixel ({mp}MP)")   
        print(f"  name='{item["name"]}', dir='{item["dir"]}'")
        print()

        for key, value in item.items():
            print(colored_text(f"  {key}", "green"), end="")
            print(": ", end="")
            print(colored_text(f"{value}", "cyan"))
        print()

        # Use specific cdata field.
        element_name = "Modell"
        if 'cdata' in item and len(item['cdata']) > 0:
            element_value = item['cdata'][0].get(element_name, None)
            print(f"Value of cdata element '{element_name}': {element_value}")
        else:
            print(f"cdata element '{element_name}' not found.")

        # Print cdata elements if they exist.
        if 'cdata' in item:
            print(f"{len(item['cdata'][0])} elements in cdata")
            for i, cdata_item in enumerate(item['cdata']):
                for key, value in cdata_item.items():
                    print(colored_text(f"  {key}", "green"), end="")
                    print(": ", end="")
                    print(colored_text(f"{value}", "cyan"))

        print("-" * 70)


if __name__ == "__main__":
    if len(sys.argv) == 2:
        picture_data(sys.argv[1])