@echo off setlocal enabledelayedexpansion echo ==================================== echo Visual Studio Solution Files Copier echo ==================================== echo. REM Get the current directory set "SOURCE_DIR=%CD%" set "TARGET_DIR=%SOURCE_DIR%\.srcout" echo Source Directory: %SOURCE_DIR% echo Target Directory: %TARGET_DIR% echo. REM Clear and create target directory if exist "%TARGET_DIR%" ( echo Clearing existing .srcout directory... rmdir /s /q "%TARGET_DIR%" 2>nul if exist "%TARGET_DIR%" ( echo Warning: Could not completely clear .srcout directory timeout /t 2 >nul ) ) echo Creating .srcout directory... mkdir "%TARGET_DIR%" 2>nul if not exist "%TARGET_DIR%" ( echo Error: Could not create .srcout directory pause exit /b 1 ) echo. echo Copying files to .srcout root directory... REM Initialize counters set "COPIED_COUNT=0" set "SKIPPED_COUNT=0" REM Function to copy files recursively, flattening directory structure call :CopyFilesFlat "%SOURCE_DIR%" echo. echo Copy operation completed! echo Files copied: %COPIED_COUNT% echo Files skipped: %SKIPPED_COUNT% goto :ContinueScript :CopyFilesFlat setlocal set "CURRENT_DIR=%~1" REM Process files in current directory for %%f in ("%CURRENT_DIR%\*") do ( if not "%%~nxf"=="" ( call :CopyFile "%%f" ) ) REM Process subdirectories (excluding blacklisted ones) for /d %%d in ("%CURRENT_DIR%\*") do ( set "DIR_NAME=%%~nxd" set "SKIP_DIR=0" REM Check if directory should be excluded if /i "!DIR_NAME!"==".vs" set "SKIP_DIR=1" if /i "!DIR_NAME!"=="bin" set "SKIP_DIR=1" if /i "!DIR_NAME!"=="obj" set "SKIP_DIR=1" if /i "!DIR_NAME!"=="packages" set "SKIP_DIR=1" if /i "!DIR_NAME!"=="TestResults" set "SKIP_DIR=1" if /i "!DIR_NAME!"==".git" set "SKIP_DIR=1" if /i "!DIR_NAME!"==".claude" set "SKIP_DIR=1" if /i "!DIR_NAME!"==".srcout" set "SKIP_DIR=1" if /i "!DIR_NAME!"=="node_modules" set "SKIP_DIR=1" if /i "!DIR_NAME!"==".nuget" set "SKIP_DIR=1" if /i "!DIR_NAME!"=="@Documentation" set "SKIP_DIR=1" if "!SKIP_DIR!"=="0" ( call :CopyFilesFlat "%%d" ) ) endlocal goto :eof :CopyFile setlocal set "SOURCE_FILE=%~1" set "FILE_NAME=%~nx1" set "FILE_EXT=%~x1" set "SKIP_FILE=0" REM Check if file should be excluded if /i "%FILE_EXT%"==".user" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".suo" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".cache" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".tmp" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".temp" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".log" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".pdb" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".exe" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".dll" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".png" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".jpg" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".gif" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".ico" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".snk" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".vspscc" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".vssscc" set "SKIP_FILE=1" if /i "%FILE_EXT%"==".scc" set "SKIP_FILE=1" if /i "%FILE_NAME%"==".DS_Store" set "SKIP_FILE=1" if /i "%FILE_NAME%"=="Thumbs.db" set "SKIP_FILE=1" if /i "%FILE_NAME%"=="desktop.ini" set "SKIP_FILE=1" if "%SKIP_FILE%"=="0" ( REM Handle duplicate filenames by adding a counter set "TARGET_FILE=%TARGET_DIR%\%FILE_NAME%" set "COUNTER=1" :CheckDuplicate if exist "!TARGET_FILE!" ( set "BASE_NAME=%~n1" set "TARGET_FILE=%TARGET_DIR%\!BASE_NAME!_!COUNTER!%FILE_EXT%" set /a "COUNTER+=1" goto :CheckDuplicate ) copy "%SOURCE_FILE%" "!TARGET_FILE!" >nul 2>&1 if !ERRORLEVEL! EQU 0 ( set /a "COPIED_COUNT+=1" echo Copied: %FILE_NAME% ) else ( echo Failed to copy: %FILE_NAME% ) ) else ( set /a "SKIPPED_COUNT+=1" ) endlocal goto :eof :ContinueScript REM Count files copied echo. echo Counting files in .srcout directory... set "FINAL_COUNT=0" for /f %%i in ('dir "%TARGET_DIR%" /b /a-d 2^>nul ^| find /c /v ""') do set "FINAL_COUNT=%%i" echo. echo ==================================== echo Copy Summary: echo ==================================== echo Files copied: %FINAL_COUNT% echo Files processed: %COPIED_COUNT% echo Files skipped: %SKIPPED_COUNT% echo Source: %SOURCE_DIR% echo Target: %TARGET_DIR% echo. echo All files are copied to .srcout root directory (flattened structure) echo Excluded directories: .vs, bin, obj, packages, TestResults, .git, .srcout, node_modules, .nuget echo Excluded files: *.user, *.suo, *.cache, *.tmp, *.temp, *.log, *.pdb, *.exe, *.dll, and others echo ==================================== REM Optional: Open target directory in Explorer set /p "OPEN_FOLDER=Open .srcout folder in Explorer? (y/n): " if /i "%OPEN_FOLDER%"=="y" ( explorer "%TARGET_DIR%" ) echo. echo Script completed. Press any key to exit... pause >nul