gen_srcout.cmd 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo ====================================
  4. echo Visual Studio Solution Files Copier
  5. echo ====================================
  6. echo.
  7. REM Get the current directory
  8. set "SOURCE_DIR=%CD%"
  9. set "TARGET_DIR=%SOURCE_DIR%\.srcout"
  10. echo Source Directory: %SOURCE_DIR%
  11. echo Target Directory: %TARGET_DIR%
  12. echo.
  13. REM Clear and create target directory
  14. if exist "%TARGET_DIR%" (
  15. echo Clearing existing .srcout directory...
  16. rmdir /s /q "%TARGET_DIR%" 2>nul
  17. if exist "%TARGET_DIR%" (
  18. echo Warning: Could not completely clear .srcout directory
  19. timeout /t 2 >nul
  20. )
  21. )
  22. echo Creating .srcout directory...
  23. mkdir "%TARGET_DIR%" 2>nul
  24. if not exist "%TARGET_DIR%" (
  25. echo Error: Could not create .srcout directory
  26. pause
  27. exit /b 1
  28. )
  29. echo.
  30. echo Copying files to .srcout root directory...
  31. REM Initialize counters
  32. set "COPIED_COUNT=0"
  33. set "SKIPPED_COUNT=0"
  34. REM Function to copy files recursively, flattening directory structure
  35. call :CopyFilesFlat "%SOURCE_DIR%"
  36. echo.
  37. echo Copy operation completed!
  38. echo Files copied: %COPIED_COUNT%
  39. echo Files skipped: %SKIPPED_COUNT%
  40. goto :ContinueScript
  41. :CopyFilesFlat
  42. setlocal
  43. set "CURRENT_DIR=%~1"
  44. REM Process files in current directory
  45. for %%f in ("%CURRENT_DIR%\*") do (
  46. if not "%%~nxf"=="" (
  47. call :CopyFile "%%f"
  48. )
  49. )
  50. REM Process subdirectories (excluding blacklisted ones)
  51. for /d %%d in ("%CURRENT_DIR%\*") do (
  52. set "DIR_NAME=%%~nxd"
  53. set "SKIP_DIR=0"
  54. REM Check if directory should be excluded
  55. if /i "!DIR_NAME!"==".vs" set "SKIP_DIR=1"
  56. if /i "!DIR_NAME!"=="bin" set "SKIP_DIR=1"
  57. if /i "!DIR_NAME!"=="obj" set "SKIP_DIR=1"
  58. if /i "!DIR_NAME!"=="packages" set "SKIP_DIR=1"
  59. if /i "!DIR_NAME!"=="TestResults" set "SKIP_DIR=1"
  60. if /i "!DIR_NAME!"==".git" set "SKIP_DIR=1"
  61. if /i "!DIR_NAME!"==".srcout" set "SKIP_DIR=1"
  62. if /i "!DIR_NAME!"=="node_modules" set "SKIP_DIR=1"
  63. if /i "!DIR_NAME!"==".nuget" set "SKIP_DIR=1"
  64. if "!SKIP_DIR!"=="0" (
  65. call :CopyFilesFlat "%%d"
  66. )
  67. )
  68. endlocal
  69. goto :eof
  70. :CopyFile
  71. setlocal
  72. set "SOURCE_FILE=%~1"
  73. set "FILE_NAME=%~nx1"
  74. set "FILE_EXT=%~x1"
  75. set "SKIP_FILE=0"
  76. REM Check if file should be excluded
  77. if /i "%FILE_EXT%"==".user" set "SKIP_FILE=1"
  78. if /i "%FILE_EXT%"==".suo" set "SKIP_FILE=1"
  79. if /i "%FILE_EXT%"==".cache" set "SKIP_FILE=1"
  80. if /i "%FILE_EXT%"==".tmp" set "SKIP_FILE=1"
  81. if /i "%FILE_EXT%"==".temp" set "SKIP_FILE=1"
  82. if /i "%FILE_EXT%"==".log" set "SKIP_FILE=1"
  83. if /i "%FILE_EXT%"==".pdb" set "SKIP_FILE=1"
  84. if /i "%FILE_EXT%"==".exe" set "SKIP_FILE=1"
  85. if /i "%FILE_EXT%"==".dll" set "SKIP_FILE=1"
  86. if /i "%FILE_EXT%"==".png" set "SKIP_FILE=1"
  87. if /i "%FILE_EXT%"==".jpg" set "SKIP_FILE=1"
  88. if /i "%FILE_EXT%"==".gif" set "SKIP_FILE=1"
  89. if /i "%FILE_EXT%"==".ico" set "SKIP_FILE=1"
  90. if /i "%FILE_EXT%"==".snk" set "SKIP_FILE=1"
  91. if /i "%FILE_EXT%"==".vspscc" set "SKIP_FILE=1"
  92. if /i "%FILE_EXT%"==".vssscc" set "SKIP_FILE=1"
  93. if /i "%FILE_EXT%"==".scc" set "SKIP_FILE=1"
  94. if /i "%FILE_NAME%"==".DS_Store" set "SKIP_FILE=1"
  95. if /i "%FILE_NAME%"=="Thumbs.db" set "SKIP_FILE=1"
  96. if /i "%FILE_NAME%"=="desktop.ini" set "SKIP_FILE=1"
  97. if "%SKIP_FILE%"=="0" (
  98. REM Handle duplicate filenames by adding a counter
  99. set "TARGET_FILE=%TARGET_DIR%\%FILE_NAME%"
  100. set "COUNTER=1"
  101. :CheckDuplicate
  102. if exist "!TARGET_FILE!" (
  103. set "BASE_NAME=%~n1"
  104. set "TARGET_FILE=%TARGET_DIR%\!BASE_NAME!_!COUNTER!%FILE_EXT%"
  105. set /a "COUNTER+=1"
  106. goto :CheckDuplicate
  107. )
  108. copy "%SOURCE_FILE%" "!TARGET_FILE!" >nul 2>&1
  109. if !ERRORLEVEL! EQU 0 (
  110. set /a "COPIED_COUNT+=1"
  111. echo Copied: %FILE_NAME%
  112. ) else (
  113. echo Failed to copy: %FILE_NAME%
  114. )
  115. ) else (
  116. set /a "SKIPPED_COUNT+=1"
  117. )
  118. endlocal
  119. goto :eof
  120. :ContinueScript
  121. REM Count files copied
  122. echo.
  123. echo Counting files in .srcout directory...
  124. set "FINAL_COUNT=0"
  125. for /f %%i in ('dir "%TARGET_DIR%" /b /a-d 2^>nul ^| find /c /v ""') do set "FINAL_COUNT=%%i"
  126. echo.
  127. echo ====================================
  128. echo Copy Summary:
  129. echo ====================================
  130. echo Files copied: %FINAL_COUNT%
  131. echo Files processed: %COPIED_COUNT%
  132. echo Files skipped: %SKIPPED_COUNT%
  133. echo Source: %SOURCE_DIR%
  134. echo Target: %TARGET_DIR%
  135. echo.
  136. echo All files are copied to .srcout root directory (flattened structure)
  137. echo Excluded directories: .vs, bin, obj, packages, TestResults, .git, .srcout, node_modules, .nuget
  138. echo Excluded files: *.user, *.suo, *.cache, *.tmp, *.temp, *.log, *.pdb, *.exe, *.dll, and others
  139. echo ====================================
  140. REM Optional: Open target directory in Explorer
  141. set /p "OPEN_FOLDER=Open .srcout folder in Explorer? (y/n): "
  142. if /i "%OPEN_FOLDER%"=="y" (
  143. explorer "%TARGET_DIR%"
  144. )
  145. echo.
  146. echo Script completed. Press any key to exit...
  147. pause >nul