Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何在FOR循环中获取批处理中当前路径%CD%的信息?_Batch File - Fatal编程技术网

Batch file 如何在FOR循环中获取批处理中当前路径%CD%的信息?

Batch file 如何在FOR循环中获取批处理中当前路径%CD%的信息?,batch-file,Batch File,我用几个逗号分隔的目录路径设置了一个环境变量,并使用FOR循环将当前目录设置为变量中的下一个目录路径。我试图得到当前路径,但结果看起来很奇怪 我尝试使用以下代码: set a=C:\test\A,C:\test\B,C:\test\C for %%i in (%a%) do ( echo %%i echo 1 %CD% cd %%i echo 2 %CD% echo "" ) 结果是: C:\test>TEST.BAT C:\test\A

我用几个逗号分隔的目录路径设置了一个环境变量,并使用FOR循环将当前目录设置为变量中的下一个目录路径。我试图得到当前路径,但结果看起来很奇怪

我尝试使用以下代码:

set a=C:\test\A,C:\test\B,C:\test\C

for %%i in (%a%) do (
    echo %%i
    echo 1 %CD%
    cd %%i
    echo 2 %CD%
    echo ""
)
结果是:

 C:\test>TEST.BAT
 C:\test\A
 1 C:\test
 2 C:\test
 ""
 C:\test\B
 1 C:\test
 2 C:\test
 ""
 C:\test\C
 1 C:\test
 2 C:\test
 ""

 C:\test\C>
%CD%
应在
CD%%i
之后更改。但是所有的
echo%CD%
输出批处理文件路径
C:\test
是启动批处理文件时的当前目录


如何获得正确的当前路径?

在命令块中使用
%variable%
开头的所有环境变量引用(
以匹配的
结尾)
在执行命令块之前,分别由Windows命令解释器用引用环境变量的当前值替换为命令块左至开始的命令

这意味着对于发布的批处理文件中的for循环,Windows命令解释器在预处理状态期间将代码修改为:

for %i in (C:\test\A C:\test\B C:\test\C) do (
echo %i
 echo 1 C:\test
 cd %i
 echo 2 C:\test
 echo ""
)
在命令提示窗口中运行批处理文件时,可以看到与发布完全相同的输出,而不是双击批处理文件,顶部的
@echo off
被删除或注释掉或修改为
@echo on

请注意目录列表中每个逗号的空格替换,
%CD%
替换为
C:\test
和修改的缩进

然后使用此预处理的命令块执行FOR命令

批处理文件中的命令
cd%%i
起作用,但环境变量引用在执行前已被变量
cd
的当前值替换,该值位于此处
C:\test

在执行FOR循环期间,需要延迟环境变量扩展以查看当前目录

@echo off
setlocal EnableDelayedExpansion
set "DirectoryList=C:\test\A C:\test\B C:\test\C"

for %%I in (%DirectoryList%) do (
    echo %%I
    echo 1 !CD!
    cd /D %%I
    echo 2 !CD!
    echo/
)

rem Other commands in batch file perhaps using DirectoryList.
endlocal
但请注意,目录/文件名中的感叹号被解释为启用了延迟环境变量扩展作为变量引用的开始/结束,这可能导致执行时出现意外行为

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • cd/?
  • echo/?
  • endlocal/?
  • 获取/?
  • rem/?
  • 设置/?
    。。。还解释了IFFOR示例上的延迟环境变量扩展
  • setlocal/?
另见以下条款:

  • 有关命令SETLOCALENDLOCAL的详细信息
  • DosTips论坛主题为什么使用
    echo/
    而不是
    echo更好。
    (或
    echo”“
    )输出空行

如果在
cd%%i
之后的循环中添加
mkdir测试
,即使
echo%cd%
告诉您不在子文件夹中,您也会看到自己在子文件夹中;奇怪的是,在执行FOR命令之前,命令块中的当前目录字符串以
开头,以匹配的
结尾)取代了
%CD%
。您需要启用并使用
!CD。在命令提示窗口中运行
set/?
,并在几页上阅读整个帮助输出,解释扩展延迟的原因。注意:
cd%%i
正在按预期工作,您只是无法正确显示当前目录,因为没有对环境变量引用使用延迟扩展。感谢您的解决方案。