Это потому, что команда type
сохранит спецификацию UTF-8, поэтому при объединении нескольких файлов с этой спецификацией конечный файл будет содержать несколько спецификаций в разных местах в середине файла.
Если вы уверены, что все файлы SQL, которые вы хотите объединить, начинаются с спецификации, то вы можете использовать следующий сценарий для удаления спецификации из каждой из них перед их фактическим объединением.
Этосделано путем передачи на выходе type
.Другая сторона канала будет использовать первые 3 байта (спецификацию) с помощью команд 3 pause
.каждый pause
будет потреблять один байт.Оставшаяся часть потока будет отправлена команде findstr
для добавления ее к окончательному сценарию.
Поскольку файлы SQL имеют кодировку UTF-8 и могут содержать любые символы в диапазоне Unicode, определенные кодовые страницы будутмешать работе и может привести к повреждению окончательного сценария SQL.
Таким образом, это было учтено, и пакетный файл будет перезапущен с кодовой страницей 437, которая безопасна для доступа к любой двоичной последовательности.
@echo off
setlocal DisableDelayedExpansion
setlocal EnableDelayedExpansion
for /F "tokens=*" %%a in ('chcp') do for %%b in (%%a) do set "CP=%%~nb"
if !CP! NEQ 437 if !CP! NEQ 65001 chcp 437 >nul && (
REM for file operations, the script must restatred in a new instance.
"%COMSPEC%" /c "%~f0"
REM Restoring previous code page
chcp !CP! >nul
exit /b
)
endlocal
set "RemoveUTF8BOM=(pause & pause & pause)>nul"
set "echoNL=echo("
set "FinalScript=C:\FinalScript\AllScripts.sql"
:: If you want the final script to start with UTF-8 BOM (This is optional)
:: Create an empty file in NotePad and save it as UTF8-BOM.txt with UTF-8 encoding.
:: Or Create a file in your HexEditor with this byte sequence: EF BB BF
:: and save it as UTF8-BOM.txt
:: The file must be exactly 3 bytes with the above sequence.
(
type "UTF8-BOM.txt" 2>nul
REM This assumes that all sql files start with UTF-8 BOM
REM If not, then they will loose their first 3 otherwise legitimate characters.
REM Resulting in a final corrupted script.
for %%A in (*.sql) do (type "%%~A" & %echoNL%)|(%RemoveUTF8BOM% & findstr "^")
)>"%FinalScript%"