首页 > 解决方案 > 在不知道所述目录名称的情况下打开多个目录并使用 Windows 批处理文件删除其中的文件夹

问题描述

好吧,我真的不知道如何完全描述我想要的东西,而且我为问这么高级的东西而感到难过。除了使用批处理移动文件夹和删除文件和文件夹外,我不知道如何做任何事情。

我正在尝试制作一个批处理文件来删除某些用于缓存数据的 Steam 文件和文件夹。我可以很容易地为自己制作这个并收工,但是我想分享它并让它也适用于其他人。问题是其中一个缓存文件夹以唯一的 Steam 标识符命名。我将把到目前为止我所做的放在下面。

REM Makes a temporary folder.
mkdir %LocalAppData%\Temp\steam_cache

REM Deleted all none essential files in Steam's configuration folder.
move "%ProgramFiles(x86)%\Steam\config\config.vdf" %LocalAppData%\Temp\steam_cache
move "%ProgramFiles(x86)%\Steam\config\loginusers.vdf" %LocalAppData%\Temp\steam_cache
rmdir "%ProgramFiles(x86)%\Steam\config" /s /q
mkdir "%ProgramFiles(x86)%\Steam\config"
move %LocalAppData%\Temp\steam_cache\config.vdf "%ProgramFiles(x86)%\Steam\config"
move %LocalAppData%\Temp\steam_cache\loginusers.vdf "%ProgramFiles(x86)%\Steam\config"

REM Delete all none essential files in Steam's userdata folder.

我将把文件结构放在下面。

%ProgramFiles(x86)%\Steam\userdata\256283931

如您所见,最后的数字是完全随机的,我不知道如何在不知道数字的情况下打开该目录。如果您使用多个帐户登录,有时会有多个具有随机名称的文件夹,我希望批处理文件一个一个进入它们并删除其中的某个文件夹。

我将把下面随机编号的文件夹中我想删除的文件夹放在下面。

%ProgramFiles(x86)%\Steam\userdata\256283931\ugcmsgcache

对不起,如果我问的太多了,请忽略这篇文章,谢谢。

标签: batch-file

解决方案


您正在寻找的是for /D循环,它枚举目录:

rem // Enumerate all directories under `userdata`:
for /D %%I in ("%ProgramFiles(x86)%\Steam\userdata\*") do (
    rem // Check if there is really a sub-directory called `ugcmsgcache`:
    if exist "%%~I\ugcmsgcache\" (
        rem // Do something with the full path, like echoing, for instance:
        echo "%%~I\ugcmsgcache"
    )
)

如果要确保枚举目录的名称/-ies 名称仅由十进制数字组成,则可以使用dirandfindstrfor /F循环

rem // Change into parent directory, because `dir /B` returns plain directory names:
cd /D "%ProgramFiles(x86)%\Steam\userdata"
rem // Enumerate all directories under `userdata`, whose names are pure numbers:
for /F "delims=" %%I in ('
    dir /B /A:D "*" ^| findstr /I /X "[0123456789]*"
') do (
    rem // Do something with the full path, like echoing, for instance:
    echo "%%~fI\ugcmsgcache"
)

cd命令也可以替换为pushdand popd

~f修饰符确保导出与当前工作目录相关的完整路径。

请注意,此处需要对管道 ( |)进行转义,因为它位于for /F循环的集合中。


推荐阅读