批处理文件只运行一次,FOR循环出错

Posted

技术标签:

【中文标题】批处理文件只运行一次,FOR循环出错【英文标题】:Batch file only run once, FOR loop at fault 【发布时间】:2021-12-14 14:49:47 【问题描述】:

我正在寻找一个批处理,它查看以“@”开头的文件夹,然后在这些文件夹中有一个名为“Keys”的子文件夹,将 file.bikey 复制到一个静态文件夹名称“keys”。

由于内部有 cd/goto 命令,我使用的 for /d 循环显然停止工作。

Main
│   key-collector.bat
│
├───@folder_a
│   └───keys
│           a.txt
│
├───@folder_b
│   └───keys
│           b.txt
│
├───@folder_c
│   └───keys
│           c.txt
└───keys
    └───(Destination)

当前代码:

@echo off
:start
set modsPath="C:\Exemple"
set keysPath="%modsPath%\keys"
for /d %%i in (@*) do (
    echo %%i
    copy /y %cd%\%%i\keys\*.txt %keysPath%
    ::cd %cd%\%%i\keys
    ::copy *.txt %keysPath%
    )
PAUSE>nul
exit

【问题讨论】:

不要在代码块内使用无效标签。将:: 更改为rem。然后在cd 命令上,为什么还要cd?只需在复制后从完整路径或pushd pathpopd 复制文件即可。 【参考方案1】:

几件事:

    用双引号设置路径,包括变量名,即set "var=value" 不要在代码块内使用无效标签::,而是使用rem 在路径中添加双引号,例如:copy /y "%cd%\%%i\keys\*.txt" "%keysPath%" 使用%%~fi 代替cd 作为完整路径
@echo off
:start
set "modsPath=C:\Example"
set "keysPath=%modsPath%\keys"
for /d %%i in (@*) do (
    echo %%~fi
    copy /y "%%~fi\keys\*.txt" "%keysPath%"
    rem comments like this
    )
pause>nul

【讨论】:

好像看不懂%%~fi,它返回:%~fi (from echo) and "Path not found" 您是否按原样复制代码?请仔细检查。 %%~f 是变量的有效扩展。见for /? 来自cmd 我将我的实际批次与我的副本混合在一起进行测试,效果很好,非常感谢您的帮助。谢谢

以上是关于批处理文件只运行一次,FOR循环出错的主要内容,如果未能解决你的问题,请参考以下文章

多处理一个for循环?

退出批处理文件中的 FOR 循环?

批处理循环语句 ?

批处理文件循环中的算术

批处理文件中延迟扩展的示例

bat命令中啥命令可以让某一行的指令重复执行