Batch file set语句don';在我的批处理文件中似乎不起作用

Batch file set语句don';在我的批处理文件中似乎不起作用,batch-file,set,Batch File,Set,我在这里找到了我的问题的解释 但我真的不明白这个解释 这是我的剧本 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

我在这里找到了我的问题的解释

但我真的不明白这个解释

这是我的剧本

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 ]
)
)

echo总是打印文件:*.sql,我将这个变量传递给的脚本总是抱怨LOAD\u file\u过滤器为空

我曾尝试按照文章中的建议添加
setlocalenabledayedexpansion
,但它并没有解决问题。
echo文件:%!LOAD\u FILE\u FILTER%
始终打印我运行的目录中的最后一个子目录。
echo%%f
始终打印正确的值

什么是“!”在变量后面为我做什么

顺便问一下,有人能给我解释一下两者的区别吗

设定!变量 和 集合变量

%变量& &!变量& !瓦尔!
%%VAR

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

set“var=”
设置“var=test”
回显%var%
读取代码时,它会删除变量的内容,为其赋值并回显

让我们将最后两个命令连接起来,对其进行一些更改

set“var=”
设置“var=test”&回显%var%
“相同”代码,但在这种情况下,控制台的输出不会显示变量中的值

为什么??在批处理文件中,要执行的行将被解析并执行。在解析阶段,每个变量读取操作(在其中检索变量的值)都会在解析时替换为存储在变量内部的值。完成此操作后,将执行生成的命令。因此,在上一个示例中,当解析第二行时,它将转换为

设置“var=test”&echo
现在,该行上没有读取操作,也没有要回显的值,因为当读取该行时,变量不包含任何值(执行该行时将分配该值),因此读取操作已被替换为零。此时,代码被执行,感知到的行为是
set
命令失败,因为我们没有将“明显的”值回显到控制台

这种行为在区块中也存在。块是用括号括起来的一组行(对于和构造,通常是
如果
构造),并且由解析器处理,就好像块中的所有行都是带有串联命令的一行一样。读取完整块,删除所有变量读取操作并替换为变量内的值,然后执行内部没有变量引用的完整块

在执行时,块内的变量没有读取操作,只有其初始值,因此,分配给块内变量的任何值都不能在同一块内检索,因为没有任何读取操作

那么,在这个代码中

设置“测试=之前”
如果定义测试(
设置“测试=之后”
回显百分比测试%
)
执行第一个
集合
后,将解析块(
if
命令及其括号中的所有代码)并将其转换为

如果定义了测试(
设置“测试=之后”
回音
)
显示“错误”的值

通常的处理方法是使用延迟扩展。它将允许您在需要时更改将变量从
%var%
读入
的语法!瓦尔,指示解析器在解析时不能删除读取操作,而是延迟到执行命令为止

setlocal enabledelayedexpansion
设置“var=”
设置“var=test”&echo!瓦尔!
现在的第三行在解析时转换为

设置“var=test”&echo!瓦尔!
是,变量引用未被删除。读取操作被延迟,直到变量值发生变化时执行
echo
命令

所以

%var%
是一个变量引用,将在解析时被替换

!瓦尔是一个变量引用,将在执行时被替换


%x
x
单个字符通常是可替换参数的
,该变量将保存正在交互的当前元素。就其自身性质而言,将在执行时扩展。命令行中使用带有单个百分号的语法。在批处理文件中,需要转义百分号,引用可替换参数的语法是
%%x

当在附加代码块(循环的
中使用
设置
并检索同一块中的变量值时,需要使用延迟扩展。另外,从变量名中去掉感叹号。启用延迟扩展后,他们只会给你带来心痛。这是一个很好的信息,但我仍然在这里转动我的轮子。基于这一解释,我希望在(Product\Database\SQL\ICWProject\Model\Scripts\*)中为/R/d%%f设置本地EnableDelayedExpansion会起作用(设置加载文件过滤器=%%f\*.sql回显文件:!加载文件过滤器!服务器:%!服务器名称%CALL%!批处理文件%s%!服务器名称%d%!数据库名称%f!加载文件过滤器!-u%!用户名%p%!密码%o%!日志文件%)
但是
!LOAD\u FILE\u FILTER!
在第一次通过循环后的计算结果总是与我期望的结果一致。请尝试使用
for/R“\Product\Database\SQL\Project\Model\Scripts”/d%%f in(*)执行…
以防止for循环执行一次。
SET!LOAD_FILE_FILTER=%%f\*。sql
似乎可以与当前循环配合使用,因为
echo!LOAD_FILE_FILTER!
是正确的。我希望能找到一个与我尝试执行的类似的示例。