/* for %%i in (*.png) do pngquant %%i --force --output %%i --skip-if-larger for %%i in (*.jpg) do jpegtran -copy none -optimize -perfect %%i %%i * */ var files = Directory.EnumerateFiles(".", "*.png" , new EnumerationOptions { RecurseSubdirectories = true , AttributesToSkip = FileAttributes.ReparsePoint , IgnoreInaccessible = true }) .ToArray(); Parallel.ForEach(files, file => { var startInfo = new ProcessStartInfo { FileName = "pngquant" , Arguments = $"\"{file}\" --force --output \"{file}\" --skip-if-larger" }; using var p = Process.Start(startInfo); p.WaitForExit(); Console.WriteLine($"{file}: {p.ExitCode}"); }); files = new[] { "*.jpg", "*.jpeg" } .SelectMany(x => Directory.EnumerateFiles( ".", x , new EnumerationOptions { RecurseSubdirectories = true , AttributesToSkip = FileAttributes.ReparsePoint , IgnoreInaccessible = true })) .ToArray(); Parallel.ForEach(files, file => { var startInfo = new ProcessStartInfo { FileName = "jpegtran" , Arguments = $"-copy none -optimize -perfect \"{file}\" \"{file}\"" }; using var p = Process.Start(startInfo); p.WaitForExit(); Console.WriteLine($"{file}: {p.ExitCode}"); });