设置语句似乎不能在我的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。 一个块是括号中的一组行(通常for
和if
构造),并由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