【问题标题】:Batch Script Exiting from Encountering For-Loop批处理脚本退出遇到 For 循环
【发布时间】:2019-07-10 13:55:26
【问题描述】:

程序一碰到第二个 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 运行 打开图片 新名称的提示 清屏 重新显示信息(文件路径和新名称)并要求确认 调用 WIP 子程序(即使我没有调用子程序,FL 也不起作用)

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

文件路径:

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    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!
    )
    

    【讨论】:

    • 谢谢!我忘记了 /F 不喜欢目录,以及重命名部分。我会将路径和新名称传递给子例程(这也会移动该图像)
    • 现在我想起来了,在第二个 FL 中重命名图像然后同时移动它们听起来更好
    • 没问题 - 是的,在循环中完成工作通常比使用参数调用子程序更容易编写和清洁。祝你好运!
    猜你喜欢
    • 2011-10-07
    • 2011-02-05
    • 2013-10-01
    • 2017-02-03
    • 2023-03-06
    • 2022-10-23
    • 2014-12-03
    • 2011-08-26
    • 2020-11-13
    相关资源
    最近更新 更多