Пакетный скрипт удаления BOM (ï »¿) из файла - PullRequest
0 голосов
/ 11 сентября 2018

Я создал пакетный скрипт для копирования файлов SQL из папки в один большой скрипт SQL.Проблема в том, что когда я запускаю этот один SQL-скрипт, возникает ошибка

Неверный синтаксис рядом с ''

Я скопировал один SQL-скрипт в Notepad ++ и установилкодирование в ANSI.Я вижу этот символ ï »OM (BOM) в строках, где происходит ошибка.

В любом случае я могу автоматически удалить это в своем пакетном скрипте.Я не хочу сохранять это вручную, каждый раз, когда я запускаю эту задачу.

Ниже приведен пакетный скрипт, который у меня сейчас

@echo off

set "path2work=C:\StoredProcedures"
cd /d "%path2work%"

echo. > C:\FinalScript\AllScripts.sql

for %%a in (*.sql) do (

    echo. >>"C:\FinalScript\AllScripts.sql"
    echo GO >>"C:\FinalScript\AllScripts.sql"
    type "%%a">>"C:\FinalScript\AllScripts.sql"
    echo. >>"C:\FinalScript\AllScripts.sql"
)

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Как уже упоминал MSalters в своем комментарии, согласно wikipedia  является представлением ANSI спецификации UTF8.

PowerShell гораздо лучше подходит для задачи, связанной с кодировкой, чем пакетная:

## Q:\Test\2018\09\11\SO_522772705.ps1
Set-Location 'C:\StoredProcedures'
Get-ChildItem '*.sql' | ForEach-Object {
    "`nGO"
    Get-Content $_.FullName -Encoding UTF8
    ""
} | Set-Content 'C:\FinalScript\AllScripts.sql' -Encoding UTF8

Чтобы быть в теме с тегом batch-file пакет, вызывающий PowerShell для основной части:

:: Q:\Test\2018\09\11\SO_522772705..cmd
@echo off
set "path2work=C:\StoredProcedures"
cd /d "%path2work%"

powershell -NoProfile -Command "Get-ChildItem '*.sql'|ForEach-Object{\"`nGO\";Get-Content $_.FullName -Enc UTF8;\"\"}|Set-Content 'C:\FinalScript\AllScripts.sql' -Enc UTF8"
0 голосов
/ 11 сентября 2018

Это потому, что команда 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%"
0 голосов
/ 11 сентября 2018

Вам просто нужно изменить кодировку на UTF-8 без спецификации и сохранить файл

Notepad++ BOM

Обратите внимание, что пункты меню немногоотличается в старых версиях Notepad ++

...