0

我正在尝试使用批处理文件将包含 sql 代码的文件转换为单个环境变量,以便与 MSSQL 实用程序 bcp 一起使用。例如,如果 InFile.sql 包含

-- This is a simple statement
SELECT *
    FROM table

的输出ECHO %query%应该是 SELECT * FROM people

下面的代码大部分时间都对我有用

SETLOCAL=ENABLEDELAYEDEXPANSION 
:: Replace VarOld with VarNew
FOR /f "delims=" %%a IN ('TYPE InFile.sql') DO ( SET line=%%a & ECHO !line:table=people! >> TmpFile1 )

:: Remove comment lines starting with  '-'  and remove newline characters
(FOR /f "eol=- delims=" %%a in (TmpFile1) DO SET/p=%%a ) <nul >TmpFile2

:: Create variable 'Query'
FOR /f "delims=" %%a IN ('TYPE TmpFile2') DO SET query=%%a

但是,第一个 FOR 循环在每行末尾添加 3 个空格字符,第二个 FOR 循环添加另一个空格字符,因此结果是 SELECT * FROM people

我可以应付额外的空格(尽管我内心的纯粹主义者并不高兴!)直到我不得不将它与长 SQL 查询和多个替换步骤一起使用 - 文件中的每一行都添加了 12 个空格字符。额外的空格足以使生成的查询长约 8300 个字符 - 对于 Windows 的批处理文件行的 8196 个字符限制来说太多了。

谁能看到我如何删除这些虚假空间?

4

2 回答 2

1

在捕获一行 infile.sql 时tokens=*,在循环中使用应该修剪空白。for这是一个概念证明,%query%包含在引号中以说明修剪:

@echo off
setlocal enabledelayedexpansion

set query=
if "%~1"=="" goto usage
if not exist "%~1" goto usage

for /f "usebackq eol=- tokens=*" %%I in ("%~f1") do (
    set "sub=%%I"
    set query=!query! !sub:table=people!
)

:: strip the leading space from %query%
echo "%query:~1%"
goto :EOF

:usage
echo Usage: %~nx0 sqlfile

示例输出:

C:\Users\me\Desktop>type infile.sql
-- This is a simple statement
SELECT *
    FROM table

C:\Users\me\Desktop>test.bat infile.sql
"SELECT * FROM people"
于 2013-03-14T18:39:38.727 回答
0

根本问题是尾随空格在重定向器之前的 SET 语句和 ECHO 语句中很重要。

在您的代码中,您需要删除第一个之后%%apeople!中的空格FOR因此:

FOR /f "delims=" %%a IN ('TYPE InFile.sql') DO (SET line=%%a&ECHO !line:table=people!>> TmpFile1)

下一个问题更微妙一些。在

(FOR /f "eol=- delims=" %%a in (TmpFile1) DO SET/p=%%a ) <nul >TmpFile2

后面的空格/p=%%a是必需的,因为它在构建 TmpFile2 时提供了从行中获取的文本之间的分隔符 - 这会导致多余的尾随空格。尝试用例如替换该空间Q-仅用于测试。

因此,您需要在最终空间QUERY构建完成后将其删除FOR

SET query=%query:~0,-1%
于 2013-03-14T23:44:54.493 回答