Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在批处理文件中的FOR命令中处理外部数据文件中的特殊字符_Batch File_Cmd_Sqlcmd - Fatal编程技术网

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