Batch file 批内for循环中的变量

Batch file 批内for循环中的变量,batch-file,Batch File,我需要一些帮助来理解一种奇怪的行为 我想在一个目录中循环查找以某些特定字符结尾的子目录。 我写这篇文章是为了测试: @ECHO. setlocal EnableDelayedExpansion set Dir=C:\test for /f "tokens=*" %%I in ('dir %Dir% /ad /b') do ( set V1=%%I set V2=!V1! set V3=%V1% set V4=%V1:~-4% set V5=!V1:~-4! ) endlocal 结果是: C

我需要一些帮助来理解一种奇怪的行为 我想在一个目录中循环查找以某些特定字符结尾的子目录。 我写这篇文章是为了测试:

@ECHO.
setlocal EnableDelayedExpansion 
set Dir=C:\test
for /f "tokens=*" %%I in ('dir %Dir% /ad /b') do (
set V1=%%I
set V2=!V1!
set V3=%V1%
set V4=%V1:~-4%
set V5=!V1:~-4!
)
endlocal
结果是:

C:>test


C:>setlocal EnableDelayedExpansion

C:>set Dir=C:\test

C:>for /F "tokens=*" %I in ('dir C:\test /ad /b') do (
set V1=%I
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - Copie
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - Copie (2)
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - Copie (3)
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - Copie (4)
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - Copie (5)
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - Copie (6)
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - Copie (7)
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>(
set V1=dir1_011 - xxx
 set V2=!V1!
 set V3=
 set V4=~-4
 set V5=!V1:~-4!
)

C:>endlocal

C:>
即使使用EnableDelayedExpansion,我也无法获取目录名的结尾


可能有人对此有一些解释?

您必须使用
之类的变量!瓦尔和非
%var%
在循环内和使用延迟扩展时

测试这一点:

@echo off
setlocal EnableDelayedExpansion 
set Dir=C:\test
for /f "delims=" %%I in ('dir %Dir% /ad /b') do (
set V1=%%I
set V2=!V1!
echo !v2!
echo !v2:~-4!
)
endlocal
pause

您必须使用像
这样的变量!瓦尔和非
%var%
在循环内和使用延迟扩展时

测试这一点:

@echo off
setlocal EnableDelayedExpansion 
set Dir=C:\test
for /f "delims=" %%I in ('dir %Dir% /ad /b') do (
set V1=%%I
set V2=!V1!
echo !v2!
echo !v2:~-4!
)
endlocal
pause

您必须使用像
这样的变量!瓦尔和非
%var%
在循环内和使用延迟扩展时

测试这一点:

@echo off
setlocal EnableDelayedExpansion 
set Dir=C:\test
for /f "delims=" %%I in ('dir %Dir% /ad /b') do (
set V1=%%I
set V2=!V1!
echo !v2!
echo !v2:~-4!
)
endlocal
pause

您必须使用像
这样的变量!瓦尔和非
%var%
在循环内和使用延迟扩展时

测试这一点:

@echo off
setlocal EnableDelayedExpansion 
set Dir=C:\test
for /f "delims=" %%I in ('dir %Dir% /ad /b') do (
set V1=%%I
set V2=!V1!
echo !v2!
echo !v2:~-4!
)
endlocal
pause

使用延迟扩展的行正在工作,但输出中没有任何内容可以显示它。您启用了ECHO,但在延迟扩展发生之前,该行会被回响,因此您无法看到结果。尝试添加像这样的行

echo V1=!V1!
echo V2=!V2!
etc.
在循环中查看延迟扩展分配的结果


当然,使用正常扩展的赋值在循环中不起作用,这就是延迟扩展被发明的原因。

使用延迟扩展的行可以工作,但输出中没有任何东西可以显示它。您启用了ECHO,但在延迟扩展发生之前,该行会被回响,因此您无法看到结果。尝试添加像这样的行

echo V1=!V1!
echo V2=!V2!
etc.
在循环中查看延迟扩展分配的结果


当然,使用正常扩展的赋值在循环中不起作用,这就是延迟扩展被发明的原因。

使用延迟扩展的行可以工作,但输出中没有任何东西可以显示它。您启用了ECHO,但在延迟扩展发生之前,该行会被回响,因此您无法看到结果。尝试添加像这样的行

echo V1=!V1!
echo V2=!V2!
etc.
在循环中查看延迟扩展分配的结果


当然,使用正常扩展的赋值在循环中不起作用,这就是延迟扩展被发明的原因。

使用延迟扩展的行可以工作,但输出中没有任何东西可以显示它。您启用了ECHO,但在延迟扩展发生之前,该行会被回响,因此您无法看到结果。尝试添加像这样的行

echo V1=!V1!
echo V2=!V2!
etc.
在循环中查看延迟扩展分配的结果


当然,使用正常扩展的赋值在循环中不起作用,这就是延迟扩展被发明的原因。

我认为OP已经知道延迟扩展,但不理解为什么回显语句不显示扩展值。我想OP已经知道延迟扩展,但不明白为什么回显语句不显示扩展值。我想OP已经知道延迟扩展,但不明白为什么回显语句不显示扩展值。我想OP已经知道延迟扩展,但不明白为什么回显语句不显示扩展值。看见