for循环输出中的杂散空间

时间:2013-03-14 17:37:04

标签: for-loop batch-file cmd

我正在尝试使用批处理文件将包含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字符限制来说太多了。

有人能看到我如何删除这些虚假空间吗?

2 个答案:

答案 0 :(得分:1)

tokens=*循环中使用for时,应该在捕获一行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"

答案 1 :(得分: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%