2013-03-14 72 views
0

我正在尝试使用批处理文件将包含sql代码的文件转换为与MSSQL实用程序bcp一起使用的单个环境变量。 例如,如果InFile.sql包含For循环的输出中的虚假空间

-- 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 

然而,第一部分为循环在每行的末尾添加3个空格字符,第二个FOR循环添加另一个空格字符,因此结果为 SELECT * FROM people

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

任何人都可以看到我可以如何删除这些虚假空间吗?

回答

1

for循环中使用tokens=*应该在捕获一行infile.sql时修剪空白。这里是包含在引号内的一个概念证明,呼应%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" 
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% 
建立后