-1

在下面的批处理脚本中,我希望所有脚本都保存在 c:\temp 中,它们将一个一个地执行并重新排列日志文件中的所有成功/错误记录,如果发生任何错误,那么它应该停止这里出现的语法错误,还有一个我只将此批处理脚本和所有 sql 脚本保存在一个文件夹中

@Echo Off
FOR /f %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript %%i
GOTO :END

:RunScript
Echo Executing %1
@set SName=someservername
@set DbName=somedbname
@set path=C:\temp

echo sqlcmd -S %SName% -d %DbName% -i %1 -o "%path%\log.txt" 
if not %errorlevel%==0 exit
Echo Completed %1

:END
4

3 回答 3

0

for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)

上面的代码将遍历文件夹中的所有 *.sql。如果在任何脚本中遇到错误,错误将记录在 output.txt 文件中,它将立即停止批处理。使用上述两行代码创建一个批处理文件并将其放入您的文件夹中(C:\temp )

于 2014-02-14T05:27:48.237 回答
0

好的,我会先指出错误,然后解决。我不知道sqlcmd,但我正在检查文档

FOR /f %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript %%i

如果文件名中有空格,可能会出现问题

@set path=C:\temp

如前所述,避免使用系统变量。SQLCMD 可能依赖于 %path%!

echo sqlcmd -S %SName% -d %DbName% -i %1 -o "%path%\log.txt" 

echo导致命令行显示,未执行!从文档中,-o参数意味着“将覆盖来自先前 sqlcmd 会话的同名文件”。因此,每次运行时sqlcmd,都会覆盖以前的日志。

if not %errorlevel%==0 exit

使用exit /b或命令行解释器已停止,这可能会在使用嵌套批处理时中断流程。

我的建议:

FOR /F "TOKENS=*" %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript "%%i"
GOTO :EOF

:RunScript
Echo Executing %1
SQLCMD -S someservername -d somedbname -i %1 -b -m-1 1>> "C:\temp\log.txt"
IF %ERRORLEVEL%==0 EXIT /B
Echo Completed %1

编辑:错字更正

编辑:校正开关:-o代表输出。更好的使用-m和捕获stdout

于 2013-08-21T10:05:04.280 回答
0

您需要在子程序结束时转到:eof(在“Echo Completed %1”之后);否则你不会从被调用的子程序中返回。您的代码还假定文件名中没有空格。是这样吗?

于 2013-08-20T14:47:25.500 回答