Batch file 在批处理文件中的FOR命令中处理外部数据文件中的特殊字符
我有一个数据文件,它以以下格式保存数据库连接信息Batch file 在批处理文件中的FOR命令中处理外部数据文件中的特殊字符,batch-file,cmd,sqlcmd,Batch File,Cmd,Sqlcmd,我有一个数据文件,它以以下格式保存数据库连接信息(以|作为分隔符): 我有一个batchfile,它读取这个文件的内容,并使用这些内容在这个文件中的每个数据库上执行一个脚本。此脚本在大多数情况下都非常有效,但当其中一个变量包含特殊字符(如%或@)时会出现问题 我在网上读到,我应该使用“setlocalenabledelayedexpansion”并用感叹号将变量括起来,但我无法实现这一点。其他一些帖子也提到使用引号而不是感叹号,但我也无法做到这一点 我希望避免更改数据文件的内容(我不希望在数据文
(以|作为分隔符)
:
我有一个batchfile,它读取这个文件的内容,并使用这些内容在这个文件中的每个数据库上执行一个脚本。此脚本在大多数情况下都非常有效,但当其中一个变量包含特殊字符(如%
或@
)时会出现问题
我在网上读到,我应该使用“setlocalenabledelayedexpansion
”并用感叹号将变量括起来,但我无法实现这一点。其他一些帖子也提到使用引号而不是感叹号,但我也无法做到这一点
我希望避免更改数据文件的内容(我不希望在数据文件中添加转义字符)
我想使用的脚本是:
rem ... more code here ...
FOR /F "eol== delims=| tokens=1,2,3,4" %%i IN (%DATABASEDATAFILE%) DO CALL :_ACTION %%i %%j %%k %%l
GOTO :_END
:_ACTION
IF "%1"=="" GOTO :EOF
SET IPSERVER=%1
SET USERNAME=%2
SET PASSWORD=%3
SET DATABASE=%4
sqlcmd -S%IPSERVER% -U%USERNAME% -P%PASSWORD% -d%DATABASE% -i%SCRIPTFILE% -o%RESULTFILE%
GOTO EOF
:_END
rem ... more code here ...
:EOF
如何使此代码正确处理特殊字符
示例:%
-密码字段中的字符
正如您可能猜到的,我不是此批处理文件或数据文件的原始创建者。您的大多数建议(延迟扩展、引用)都是正确的,但顺序很重要
setlocal DisableDelayedExpansion
FOR /F "eol== delims=| tokens=1,2,3,4" %%i IN (%DATABASEDATAFILE%) DO (
SET "IPSERVER=%%i
SET "USERNAME=%%j"
SET "PASSWORD=%%k"
SET "DATABASE=%%l"
CALL :ACTION
)
goto :EOF
:ACTION
setlocal EnableDelayedExpansion
sqlcmd -S!IPSERVER! -U!USERNAME! -P!PASSWORD! -d!DATABASE! -i!SCRIPTFILE! -o!RESULTFILE!
endlocal
goto :EOF
@ECHO关闭
SETLOCAL
对于(%DATABASEDATAFILE%)中的/f“tokens=1-4delims=|”%%a,执行ECHO sqlcmd-S%%a-U%%b-P%%c-d%%d-i%SCRIPTFILE%%o%RESULTFILE%
后藤:EOF
我们应该做到这一点。我刚刚ECHO
编辑了生成的SQL行-在验证之后,您需要将ECHO sqlcmd
更改为sqlcmd
,以执行sqlcmd
setlocal DisableDelayedExpansion
FOR /F "eol== delims=| tokens=1,2,3,4" %%i IN (%DATABASEDATAFILE%) DO (
SET "IPSERVER=%%i
SET "USERNAME=%%j"
SET "PASSWORD=%%k"
SET "DATABASE=%%l"
CALL :ACTION
)
goto :EOF
:ACTION
setlocal EnableDelayedExpansion
sqlcmd -S!IPSERVER! -U!USERNAME! -P!PASSWORD! -d!DATABASE! -i!SCRIPTFILE! -o!RESULTFILE!
endlocal
goto :EOF