在不知道目录名称的情况下打开多个目录,并使用Windows批处理文件

时间:2019-03-19 18:07:01

标签: batch-file

好吧,我真的不知道如何完整地描述我想要的东西,我对提出如此高级的要求感到很难过。除了移动文件夹以及使用批处理删除文件和文件夹外,我不知道该怎么办。

我正在尝试制作一个批处理文件,以删除某些用于缓存数据的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

对不起,如果我要的太多,请忽略此帖子,谢谢。

1 个答案:

答案 0 :(得分:0)

您正在寻找的是for /D loop,它列举了目录:

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"
    )
)

如果要确保枚举目录的名称仅包含小数,则可以使用dirfindstr以及{{3} }:

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"
)

for /F loop也可以替换为cd commandpushd

popd确保派生与当前工作目录相关的完整路径。

请注意,~f modifier在此处必须为pipe (|),因为它位于for /F循环的集合中。