Windows批处理脚本意外终止

时间:2016-03-09 17:31:17

标签: batch-file cmd

我不熟悉windows批次。
我正在尝试编写一个将包含在数据库迁移脚本链中的脚本。它应检查SQL脚本是否具有硬编码的数据库名称,如果发现任何,则应警告用户,输出文件名,并停止链执行。

我认为它存在多个问题..

set "lf=^"
setlocal EnableDelayedExpansion
for %%a in (functions sprocs up views) do (
    cd %%a
    for /f "tokens=*" %%b in ('findstr /lism "[MyDatabase]" *.sql') do (
        if not [%%b] == [] (
            call :append %%a\%%b
        )
    )
    cd ..
)
if [%sinList%] == [] (
    echo No hardcoded names in scripts found, continuing..
    pause
) else (
    echo Cannot continue database migration until you clear out hardcoded database name in files^%lf%%lf%
    echo Files with hardcode^%lf%%lf% : %sinList%
    pause
    exit /b 1
)
goto :eof

:append
if defined sinList (
    set sinList=%sinList%%1^%lf%%lf%
) else (
    set sinList=%1^%lf%%lf%
)
goto :eof

现在当我执行它时,我最终进入/sprocs文件夹,不会输出任何结果。

启用echo就像这样

  

C:\门户\ Database.Migration> dbname_hardcode_punisher.cmd
  C:\ Portal \ Database.Migration>设置“lf = ^”
  C:\ Portal \ Database.Migration>设置“sinList =”
  C:\ Portal \ Database.Migration> setlocal EnableDelayedExpansion
  C:\ Portal \ Database.Migration> for%a in(functions sprocs up views)do   (cd%a for / F“tokens = *”%b in('findstr / lism“[MyDatabase]” .sql')do   (如果不是[%b] == [](调用:追加%a \%b))cd ..)   C:\ Portal \ Database.Migration>(/ F“tokens = ”%b in的cd函数   ('findstr / lism'[MyDatabase]“ .sql')do(如果不是[%b] == [](调用   :追加函数\%b))cd ..)C:\ Portal \ Database.Migration>(cd   ('findstr / lism“[MyDatabase]”* .sql')中的/ F“tokens = ”%b的sprocs   do(如果不是[%b] == [](调用:追加sprocs \%b))cd ..)   C:\ Portal \ Database.Migration \ sprocs>(如果不是[Proc_name.sql] == []   (调用:追加sprocs \ Another_proc.sql))

另外我担心if [%sinList%] == []可能无法返回预期的结果,因为它可能有一个换行符?

1 个答案:

答案 0 :(得分:0)

要使LineFeed技巧发挥作用,它需要延迟扩展(包括lf和变量)和两个空行:

setlocal enabledelayedexpansion
set lf=^
%= don't delete =%
%= these two lines =%
set new=hello!lf!world
echo !new!
echo Hello!lf!World

(问:两个必需的空行在哪里?A:%= anything =%没有定义,因此被解析为空(空)。只是提醒程序员不要删除它们;你也可以使用空行)