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

Find the latest sub-folder within a directory only if that directory exists batch script

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

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

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

在您的代码中,当整个 IF 语句被读取时,%abc% 在您的嵌套 echo 语句中被展开,然后您的 set 语句分配它。如果在 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
)

你需要做的是开启延迟展开,然后echo !abc!而不是 %abc%.

键入 "help set" 并查找 "Delayed environment variable expansion" 以获取更多详细信息。

另一种方法是将 echo 语句替换为对 IF 语句之外的子例程的调用。 call语句本身会在解析IF语句的时候,但是子程序中的语句会正常求值。

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