设置语句似乎不能在我的batch file中工作

我发现这里似乎是我的问题的解释

DOS批处理:为什么我的设置命令导致没有得到存储?

但是我不太了解这个解释。

这是我的脚本…

for /R /d %%f in (\Product\Database\SQL\Project\Model\Scripts\*) DO ( REM echo %%f SET !LOAD_FILE_FILTER= %%f\*.sql echo file: %!LOAD_FILE_FILTER% CALL %!BATCH_FILE% -u %!USER_NAME% -p %!PASSWORD% -s %!SERVER_NAME% -d %!DATABASE_NAME% -f %!LOAD_FILE_FILTER% -o %!LOG_FILE% IF %!EchoErrors%==1 ( ECHO [ TYPE %!LOG_FILE% ECHO ] ) 

回声总是打印文件:* .sql和脚本我传递这个variables总是抱怨LOAD_FILE_FILTER是空的。

我曾尝试添加文章中build议的setlocal EnableDelayedExpansion但它不能解决问题。 echo file: %!LOAD_FILE_FILTER%总是打印我运行的目录中的最后一个子目录。 echo %%f总是打印正确的值。

什么“!” 在variables后面对我做什么?

在一个侧面说明,有人可以向我解释之间的区别

SET!VAR和SET VAR

%VAR&&!VAR&!VAR! %% VAR

我们将从一个简单的案例开始

 set "var=" set "var=test" echo %var% 

读取代码,它将删除variables的内容,为其分配一个新值并对其进行回应。

让我们改变它连接最后两个命令

 set "var=" set "var=test" & echo %var% 

“相同”代码,但在这种情况下,输出到控制台将不会显示variables中的值。

为什么? 在batch file中,要执行的行被parsing并执行。 在parsing阶段,每个variables读取操作(在您检索variables值的位置)将被replace为在parsing时间内存储在variables中的值。 一旦完成,执行结果命令。 所以,在前面的例子中,当第二行被parsing时,它被转换为

 set "var=test" & echo 

现在,行上没有读操作,也没有值回显,就像行被读取一样,variables没有保存任何值(当行被执行时会被赋值),所以读操作被replace为空。 在这一点上,代码被执行,并认为行为是set命令失败,因为我们没有得到“明显”的价值回应控制台。

这种行为也可以在块中find。 一个块是括号中的一组行(通常forif构造),并由parsing器处理,就好像块中的所有行只有一行连续的命令一样。 整个模块被淘汰,所有的variables读取操作被删除,并被replace为variables内部的值,然后完整的模块,内部没有variables引用被执行。

在执行时,块内部的variables没有读取操作,只有它的初始值,因此,在块内部分配给variables的任何值都不能在同一个块内被检索,因为没有任何读取操作。

所以,在这个代码中

 set "test=before" if defined test ( set "test=after" echo %test% ) 

在第一set执行后,块( if命令和其括号中的所有代码)将被parsing并转换成

 if defined test ( set "test=after" echo before ) 

显示“错误”的价值。

处理它的通常方法是使用延迟扩展。 它将允许您在需要的地方更改将%var%的variables读入!var!的语法!var! ,向parsing器指示读取操作不能在parsing时被移除,而是延迟直到命令被执行。

 setlocal enabledelayedexpansion set "var=" set "var=test" & echo !var! 

现在的第三行是在parsing时间转换为

 set "var=test" & echo !var! 

是的,variables引用不会被删除。 当variables的值被改变时,读操作被延迟直到echo命令被执行。

所以

%var%是一个将在parsing时被replace的variables引用

!var! 是一个将在执行时被replace的variables引用

%x与单个字符通常是一个可replace的参数,一个将保存当前元素被整合的variables。 由于其自身性质,将在执行时扩大。 在命令行中使用带单个百分号的语法。 在batch file中,百分号需要转义,引用可replace参数的语法是%%x