MoveFileToFolderCommand.cs
using System;
using System.Management.Automation; using System.IO; namespace FilesToFolders { [Cmdlet(VerbsCommon.Move, "FileToFolder", SupportsShouldProcess = true)] [OutputType(typeof(VerboseRecord))] public class MoveFileToFolderCommand : PSCmdlet { [Parameter( Mandatory = true, Position = 0)] public string Path { get; set; } [Parameter( Position = 1)] [ValidateSet("yyyy-MM-dd", "yyyy-MM", "yyyy")] public string FolderNameFormat { get; set; } = "yyyy-MM"; // If any folders on given path exist, create a folder(s) in that path with // the Day, Month, Year, naming standard: "2023-01-31", "2023-01", "2023" // and move the files there protected override void ProcessRecord() { if (Directory.Exists(Path)) { WriteVerbose("Path exists."); // Create two variables with the files full path and // the files creation date string[] files = Directory.GetFiles(Path); foreach (string f in files) { // New variable that stores CreationDateTime of file DateTime d = File.GetCreationTime(f); string folderNameFormat = d.ToString(FolderNameFormat); string fullPath = System.IO.Path.Combine(Path, folderNameFormat); WriteVerbose($"{f} will move to: {fullPath}."); if (ShouldProcess($"{f} -> {fullPath}")) { bool testPath = Directory.Exists(fullPath); // If path does not exist, output progress and create if (!testPath) { WriteObject($"Creating dir: {fullPath}"); Directory.CreateDirectory(fullPath); } // Get the filename only to build destination path string fileName = System.IO.Path.GetFileName(f); WriteObject($"Moving file: {f}"); // Build the destination path and move the file string destinationPath = System.IO.Path.Combine(fullPath,fileName); File.Move(f, destinationPath); // Verbose msg WriteVerbose($"{f} was moved to {destinationPath}."); } } } else { throw new PathNotFoundException(); } } protected override void EndProcessing() { WriteVerbose("End!"); } } } |