仅当该目录存在批处理脚本时,才在该目录中查找最新的子文件夹

时间:2018-11-26 16:31:53

标签: batch-file for-loop if-statement delayedvariableexpansion

仅在该目录存在的情况下,我才尝试查找该目录中的最新子文件夹。当我在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语句时,我得到的是最新文件夹的正确输出。我在这里观察到的是,当我们在FOR语句中使用IF循环时,代码回显了变量'abc'的空白输出。我的问题是,批处理脚本是否不允许我们在IF语句中使用FOR循环?如果是这样,我可以在这里采取任何变通方法以达到预期的结果吗?

1 个答案:

答案 0 :(得分:0)

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

在您的代码中,在读取整个IF语句之前(在set语句分配它之前),在嵌套的echo语句中扩展了%abc%。如果在退出外观后查看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语句时将使用call语句,但是子例程中的语句将被正常评估。

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