在批处理脚本中的for循环中更改目录

时间:2018-08-26 13:16:29

标签: batch-file

我想编写一个批处理脚本,该脚本会将子目录中的“ am_test.txt”复制到新路径,但是我在更改for循环中的路径时遇到了困难。在我的批处理脚本中,以下行不起作用“ cd!temp!\ testdata”。谁能告诉我原因:

@echo off
setlocal enabledelayedexpansion
goto:main
goto:eof

:main
setlocal
for /d %%x in (*) DO (
   set temp=%%~fx
   echo !temp!
   cd !temp!\testdata
   copy am_test*.txt E:\Work_folder
)
endlocal

2 个答案:

答案 0 :(得分:0)

这是一种执行代码似乎打算执行的操作的方式。

作为批处理文件:

@For /D %%A In (*) Do @If Exist "%%A\testdata\am_test*.txt" Copy "%%A\testdata\am_test*.txt" "E:\Work_folder">Nul

在命令提示符处:

For /D %A In (*) Do @If Exist "%A\testdata\am_test*.txt" Copy "%A\testdata\am_test*.txt" "E:\Work_folder">Nul

无论哪种情况,E:\Work_folder必须存在。

答案 1 :(得分:0)

@echo off
setlocal enabledelayedexpansion

rem pushd popd
for /d %%x in (*) do (echo ---& echo fx: "%%~fx") & (pushd "%%x") && (echo cd: "!cd!") & popd

rem cd
for /d %%x in (*) do (echo ---& echo fx: "%%~fx") & (cd "%%x") & echo cd: "!cd!"

exit /b

要了解导致问题的原因,请创建一个脚本 这样做虽然可以解决问题,但效果相似。上面的代码 显示类似的问题。

在驱动器Z:中创建的文件夹,其名称分别为abc

脚本输出为

---
fx: "Z:\a"
cd: "Z:\a"
---
fx: "Z:\b"
cd: "Z:\b"
---
fx: "Z:\c"
cd: "Z:\c"
---
fx: "Z:\a"
cd: "Z:\a"
---
fx: "Z:\a\b"
The system cannot find the path specified.
cd: "Z:\a"
---
fx: "Z:\a\c"
The system cannot find the path specified.
cd: "Z:\a"

pushdpopd成功并且看起来正确。 当前目录将在下一次迭代之前恢复。

cda成功,但以bc失败。 该失败基于更改时迭代*文件夹 循环中的目录,而不还原它。 由于返回的文件夹是相对于初始当前目录的相对名称, %%~fx的路径可能无效,因为系统正在使用完整的 当前目录的路径,并带有迭代的文件夹名称。