gpt4 book ai didi

batch-file - 批处理脚本从文件中删除 BOM ()

转载 作者:行者123 更新时间:2023-12-05 00:59:49 32 4
gpt4 key购买 nike

我创建了一个批处理脚本来将 SQL 文件从一个文件夹复制到一个大的 SQL 脚本中。问题是当我运行这个 SQL 脚本时,它会出现错误

Incorrect syntax near ''

我将一个 SQL 脚本复制到 Notepad++ 中,并将编码设置为 ANSI。我在发生错误的行上看到了这个符号  (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"
)

最佳答案

这是因为 type 命令会保留 UTF-8 BOM,所以当你合并多个具有 BOM 的文件时,最终文件将在文件中间的不同位置包含多个 BOM .

如果您确定要合并的所有 SQL 文件都从 BOM 开始,那么您可以使用以下脚本在实际合并之前从每个文件中删除 BOM。

这是通过管道输出 type 来完成的。管道的另一端将在 3 个 pause 命令的帮助下消耗前 3 个字节(BOM)。每个 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%"

关于batch-file - 批处理脚本从文件中删除 BOM (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52272705/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com