Keal's Bulk Zip Renamer.txt: //// J: Keal's Bulk Zip Renamer(1).ps1 File Keal's Bulk Zip Renamer.json File Update this so it accepts a list of alternative paths and file extensions to apply renames to. Ariel: I’ll inspect the PowerShell script and its JSON config, then patch both so the renamer can target multiple rename locations and extension sets without breaking the current single-root behavior. J: Keal's Bulk Zip Renamer(1).ps1 File Keal's Bulk Zip Renamer.json File Update this so it independently accepts a list of alternative paths and file extensions to apply renames to. Ariel: I found the current script still hard-codes *.zip scanning and a single Root. I’m also fixing the uploaded-copy filename mismatch so the script can still find the JSON when Windows appends (1) to the script name. Done. I updated the renamer so paths and extensions are independent lists: every configured extension is applied across the J: (1) should be irrelevant, that is just how the file linked to ChatGPT. Ariel: Good catch. I’ll remove the (1) fallback handling entirely and keep config lookup tied to the actual script basename, since that suffix is only an upload artifact here. Done — I removed the (1) fallback handling and kept config lookup tied to the actual script basename. I also expanded the config from the original single Root value into independent lists for paths and extensions, preserving C3-1A as the default root. Updated files: Download updated ZIP Updated PowerShell script Updated JSON config The config now supports: { "Root": "C3-1A", "AlternativePaths": [], "Extensions": [ ".zip" ] } AlternativePaths and Extensions are independent: every listed extension is applied across Root plus every listed alternative path. J: Allow a gate for timestamping per extension. Ariel: I’ll patch the config so each extension can independently opt in or out of timestamping, then update the script to honor that gate while keeping the existing extension list behavior intact. I’m making this backward-compatible: if no timestamp gate is configured, existing behavior stays the same. Once a gate is present, each extension can be explicitly timestamped or cleaned-only. J: How do alternative paths work? Ariel: Alternative paths are not fallbacks. The script treats Root plus every entry in AlternativePaths as independent roots, then recursively applies the same extension rules to each root. Thought for 1m 21s The first write hit a permissions issue on the existing uploaded filename, so I’m writing fresh corrected output files instead of modifying the locked upload in place. Done — I updated the renamer with a per-extension timestamp gate and kept the existing Root / AlternativePaths behavior. The original config only had Root: C3-1A, so I preserved that as the default root. Downloads: Updated ZIP Updated PowerShell script Updated JSON config Alternative paths work as additive roots. The script scans Root plus every entry in AlternativePaths; it is not a fallback chain. Every configured extension is applied recursively to every listed path. Example config: { "Root": "C3-1A", "AlternativePaths": [ "C3-1B", "C3-Archive" ], "Extensions": [ ".zip", ".html", ".json" ], "TimestampByExtension": { ".zip": true, ".html": false, ".json": false } } With that config: .zip files are cleaned and timestamped when missing a timestamp. .html and .json files are cleaned/renamed but do not get a new timestamp appended. Any extension not listed in TimestampByExtension defaults to timestamping on, preserving the previous behavior. Extension formats like zip, .zip, and *.zip are normalized to .zip. J: It should only apply to all Alternative Paths under root, not everything under root. Ariel: Understood — Root should be the base folder, and AlternativePaths should be relative subpaths under that root. I’ll adjust the scan set so it no longer processes the entire root directly unless explicitly listed. I’ve got the intended model now: Root is just the anchor, while each AlternativePaths entry is joined under that root. To process the root itself, it will require an explicit "." entry rather than happening automatically. Thought for 1m 22s Fixed — Root is now only the base anchor, and the script only scans paths listed in AlternativePaths under that root. It no longer scans everything under Root automatically. I kept the original Root: C3-1A value from the uploaded config. Downloads: Updated ZIP Updated PowerShell script Updated JSON config The intended config shape is now: { "Root": "C3-1A", "AlternativePaths": [ "Some Subfolder", "Another Subfolder" ], "Extensions": [ ".zip", ".json" ], "TimestampByExtension": { ".zip": true, ".json": false } } Behavior: Scans C3-1A\Some Subfolder Scans C3-1A\Another Subfolder Does not scan all of C3-1A Refuses absolute AlternativePaths Refuses .. paths that escape Root Use "." in AlternativePaths only when you explicitly want to process the root itself.