0

仅当该目录存在时,我才尝试在目录中查找最新的子文件夹。当我在语句中使用FOR循环时,我的代码没有给我任何输出。IF这是我的代码 -

@echo off
IF EXIST "D:\MyDirectory" (
    FOR /F "delims=" %%i IN ('dir "D:\MyDirectory" /b /ad-h /t:c /od') DO SET abc=%%i
    echo Most recent subfolder: %abc%
) ELSE (
    echo Directory not found
)

我的代码单独工作正常

1.单独检查目录是否存在,

IF EXIST "D:\MyDirectory" (
    echo Directory exists
) ELSE (
    echo Directory does not exists
)

2. 要查找最近的文件夹,

FOR /F "delims=" %%i IN ('dir "D:\MyDirectory" /b /ad-h /t:c /od') 
DO SET abc=%%i
echo Most recent subfolder: %abc%

FOR基本上,当我不结合循环和IF语句时,我会得到最新文件夹的正确输出。我在这里观察到的是,当我们在语句中使用循环时,代码会回显变量“abc”的空白输出。我的问题是,批处理脚本不允许我们在 IF 语句中使用循环吗?如果是这样,我可以在这里采取任何解决方法来达到预期的结果吗?FORIFFOR

4

1 回答 1

1

是的,您可以在 IF 中使用 FOR。

在您的代码中, %abc% 在您的 set 语句分配它之前,在读取整个 IF 语句时在嵌套的 echo 语句中进行扩展。如果在 for look 退出后查看 abc,则 abc 应该设置正确。您还可以在执行 IF 语句之前尝试将 ABC 设置为类似 FOO 的指示值,您会看到它与指示值相呼应。它会在 IF 执行后正确设置。

setlocal enabledelayedexpansion
IF EXIST "D:\MyDirectory" (
FOR /F "delims=" %%i IN ('dir "D:\MyDirectory" /b /ad-h /t:c /od') DO SET abc=%%i
echo Most recent subfolder: !abc!
) ELSE (
echo Directory not found
)

您需要做的是启用延迟扩展,然后回显!abc!而不是 %abc%。

键入“帮助设置”并查找“延迟的环境变量扩展”以获取更多详细信息。

另一种方法是用对 IF 语句之外的子例程的调用来替换您的 echo 语句。调用语句本身将在解析 IF 语句时,但子例程中的语句将被正常评估。

请注意,循环控制变量 %%i 在循环执行之前未解析 - 可以保留 % 符号。

于 2018-11-26T16:49:41.953 回答