首页 > 解决方案 > 批处理脚本退出遇到 For 循环

问题描述

程序在遇到第二个 FOR 循环时立即退出而不发出警告FOR /F %inputDir% %%F in (*.jpg) do

我在 Windows 10 机器上运行,移动和重命名图片

我已经尝试过设置断点和标志,但无济于事。我什至尝试在 FOR 循环 (FL) 中只使用一个虚拟负载(只是一个回显然后暂停),因为我从某个地方了解到批处理一次执行整个 FL。我没有尝试过使用延迟扩展,但愿意学习如何。

@echo off
echo LOADING CONFIG
cd "Batch stuff"
FOR /F "tokens=1,2 delims=&" %%A in (config.txt) do (
REM echo %%A
REM echo %%B
SET inputDir=%%A
SET outputDir=%%B
)
echo inputDirectory: %inputDir%
echo outputDirectory: %outputDir%

echo CONFIG LOADED
echo Continue?
pause





FOR /F %inputDir% %%F in (*.jpg) do (
echo here
pause
cls
echo openning: %%F
echo newName: 
SET /P newName=Enter a new name for this image: 
cls 
echo openning: %%F
echo newName: %newName%

echo Hit space to continue or exit the program (manually)
pause
REM CALL nameAndMove %%F %newName%


)

预期结果:第二次 FL 运行打开图片提示 newName 清除屏幕重新显示信息(文件路径和 newName)并要求确认调用 WIP 子例程(即使我没有调用子例程,FL 也不起作用)

由于程序在我有机会看到任何错误消息之前退出,我无法看到任何错误消息。即使在第二个 FOR 循环之后使用暂停功能,我仍然无法让程序冻结。我认为这与不正确的语法有关,因为 FL 因虚拟负载而失败。

文件路径:

文件路径

标签: batch-file

解决方案


for /f不允许您像尝试那样指定目录路径。如果你想遍历一个目录(包括子文件夹),你需要for /r这样:

for /r "%inputDir%" %%A in (*.jpg) do (
    echo %%~nxA
)

如果您要在每次循环迭代时使用您的参数(即,如果您想更改每个 .jpg 的名称),您将需要使用延迟扩展。我首选的方法是将参数分配为变量,然后在延迟扩展期间使用该变量时只需使用感叹号:

setlocal enabledelayedexpansion
for /r "%inputDir%" %%A in (*.jpg) do (
    set "jpg=%%~nxA"
    echo I need to change the name of !jpg!
)

推荐阅读