【问题标题】:using multiple command for loops in batch files在批处理文件中使用多个命令 for 循环
【发布时间】:2018-01-09 11:51:28
【问题描述】:

我正在尝试使用多行循环但没有成功 - 代码似乎被炸毁了。我已经打开 EnableDelayedExpansion 但这似乎也没有帮助:-(代码似乎在“echo start for loop”之后退出。

任何为什么这不起作用的想法将不胜感激:-)

谢谢,海伦。

:: script to rename tv/radio folders with issue date.

@echo off
:: All vars set in this file will be local:
SETLOCAL
setlocal EnableDelayedExpansion

:SetDate
echo.
set /P NewDate=Please enter date to rename to (yymmdd) or "x" to exit:
echo.
echo new date = %NewDate%
:: Loop to user input until a character is entered:
if "%NewDate%"=="" GOTO Error
If "%NewDate%"=="x" GOTO Exit
:: User has entered a value so confirm it is correct.
GOTO ConfirmDate

:ConfirmDate
echo.
set /P Confirmation=Is this date correct? (y/n):
echo.
echo confirmation = %Confirmation%
if "%Confirmation%"=="y" GOTO RenameFolders
:: Else
GOTO SetDate

:RenameFolders
:: for each folder name containing "xxx", replace "xxx" with the new date
echo.
echo start for loop
for /D %%D in ("?xxx*") do (
    set "PDIR=%%~fD" & set "NAME=%%~nxD"
    echo check whether folder exists
    if EXIST "!NAME:xxx=%NewDate%!" (
        echo.
        echo folders already exist! - remove them and try again!
        GOTO :End
    ) ELSE (
        move "!PDIR!" "!NAME:xxx=%NewDate%!"
    )
)
echo.
echo Folder rename is complete. Thank you.
GOTO End

:Error
echo.
echo You did not enter a date!!
GOTO SetDate

:Exit
echo.
echo User requested exit, bye bye!
GOTO End

:End
::Remember to end command for local vars:
ENDLOCAL
:: exit script

【问题讨论】:

  • 为什么不用“暂停”来帮助调试呢?无论如何,我认为上面没有错误。
  • 谢谢,万森特。但是,它绝对不会运行 for 循环代码,因为我从未到达“回显检查文件夹是否存在”这一行 :-( 我只能假设这是由于 for 循环的复杂性造成的?
  • 代码应该做什么以及它实际做什么?您告诉我们的越多,就越容易帮助您...
  • 好的,它应该做的是:for 循环应该搜索包含字符串“xxx”的所有文件夹,并将其替换为用户在脚本前面提供的日期。在尝试使用“移动”命令重命名文件夹之前,for 循环应检查新文件夹名称是否已经存在,如果存在,则退出脚本。如果它不存在,则应使用移动命令重命名文件夹。实际发生的情况:脚本落在“echo start for loop”和“echo check if folder是否存在”之间的某个地方
  • 我的方法是从循环中删除整个if..else 命令,并将`echo %%D` 作为for 的第一行。这可能会揭示哪些语句导致了问题。我也会使用像editplus 这样的适当文本编辑器,因为使用 WP 会造成严重破坏。无论如何,请确保将批处理文件保存为 ASCII,而不是 unicode。遗憾的是,如果没有目标目录的列表,我们将无法重现您的症状。代码似乎没问题。

标签: windows batch-file


【解决方案1】:

感谢大家的帮助:-)

我发现了问题的根源......不知何故,包含“xxx”的文件夹已从源/目标目录中删除,因此 for 循环无法使用,但由于 echo 已关闭,大概我错过了一条消息可能使我更快地弄清楚这一点!嗬!多么愚蠢的错误:-(下次我会尽量不要这么快跳枪......

谢谢,海伦。

【讨论】:

    【解决方案2】:

    据我所知,当不存在任何目录时,您的 for 循环并没有什么问题。

    问题在于,当找到现有目录时,您已专门将代码指示为GOTO :End,这会“中断”循环。

    您必须决定在现有目录名称的情况下如何最好地采取行动,并相应地更改您的代码。

    【讨论】:

    • 谢谢,但我从来没有真正做到这一点,因为代码似乎在那之前就崩溃了,我不知道为什么:-(我对批处理文件和相关命令很陌生所以希望我可能犯了一些愚蠢的错误......
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 2017-03-27
    • 2013-10-07
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多