重命名具有不同名称的文件夹或删除它们?

时间:2015-11-10 19:07:26

标签: batch-file

我需要找到一种使用批处理文件的方法来查找和重命名文件夹。有问题的文件夹位于不同的用户配置文件中,因此我无法确定可以使用的通配符或变量。

在更详细的方法中,我有一个意外部署到大量计算机的文件夹。该文件夹已部署到每个用户Start Menu,并且不包含任何内容。所以我的服务台正在接听关于这个新的"测试"出现在夜间的文件夹,里面没有任何内容或文本文件。虽然有些用户被告知要删除它,但其他人只是希望我们对此做些什么。由于Start Menu位于每个用户个人资料中,因此我需要一种方法在所有用户个人资料Start Menu位置进行递归搜索,然后查找并重命名或删除该文件夹。

无论位置如何,问题中的所有文件夹都以相同的5个字符开头,但它们以()中的用户名结尾。我尝试使用*,但我的命令是引号,所以它按字面意思而不是查找xxxxx *,其中*与个人资料不同。

这是可能的,还是让我感到困惑甚至是最好的?

这是我正在努力工作的副本。前两行确定它是XP还是Win7,并根据IF EXIST的结果告诉它从哪里开始。然后它试图找到位于每个用户配置文件Start Menu中的名为TEST的任何文件夹/目录。

IF EXIST "C:\Documents and Settings\" PUSHD "C:\Documents and Settings\"
IF EXIST "C:\Users\" PUSHD "C:\Users\"
FOR /F "tokens=*" %%G in ('dir /a:d-s-h /b') do (
    IF EXIST "%%G\Start Menu\Programs\TEST" rmdir /q /s "%%G\Start Menu\Programs\TEST"
    IF EXIST "%%G\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\TEST" rmdir /q /s "%%G\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\TEST"
)
POPD

问题是整个文件夹名称是TEST (user name)。我已尝试输入Test *,但它不起作用,因为我认为它使用引用的名称详细而不是使用*作为通配符。因此,每个配置文件中的文件夹名称都不同,我需要仅在单词Test上键入代码,因为这通常不适用于任何其他应用程序,并且不关心括号内的任何名称。然后,只需使用 RMDIR 删除该文件夹。

没有VB脚本,这里没有批准。批处理文件将使用推送文件夹的相同方法从服务器推送,但我们希望它检查所有用户配置文件,因为许多受影响的计算机不只有一个特定用户。对于在推送时登录的任何用户,推送会将文件夹放入Start Menu,并且推送重复30分钟,直到我们注意到有人打电话给我们的帮助台时发生了什么名为TEST的新文件夹显示在“开始”菜单上。修复程序将在一夜之间运行,因此也不会有用户登录。

1 个答案:

答案 0 :(得分:0)

以下是此任务的注释批处理代码:

@echo off
rem Make the parent directory of the profile directory of current user
rem the current directory if this directory exists on current machine.
if exist "%USERPROFILE%\..\" pushd "%USERPROFILE%\..\" & goto RemoveDirectories

rem Make the standard user profiles directory on English Windows XP
rem the current directory if this directory exists on current machine.
if exist "C:\Documents and Settings" pushd "C:\Documents and Settings" & goto RemoveDirectories

rem Make the standard user profiles directory on Windows Vista or later
rem Windows in any language if this directory exists on current machine.
if exist "C:\Users" pushd "C:\Users" & goto RemoveDirectories

goto :EOF

:RemoveDirectories
rem Find in all subdirectories a directory starting with "Test",
rem having next a space character, then an opening parenthesis,
rem any other string (user name) and last a closing parenthesis.

for /F "tokens=*" %%G in ('dir /A:D /B /S "Test (*)" 2^>nul') do rmdir /Q /S "%%~G" 2>nul

rem Restore the previous current directory.
popd

与您的方法相比,重要的区别是命令 DIR 上的选项/S,以便从C:\Documents and Settings所有子目录中获取感兴趣的目录或C:\Users

如果目录树中的任何其他位置的目录Test (*)而不是开始菜单,则这可能是至关重要的。您可以在删除目录之前评估要删除的目录是否包含在路径Start Menu中,只是为了确保删除正确的目录。但只有当所有机器都运行英文Windows时才有效。

@echo off
rem Make the parent directory of the profile directory of current user
rem the current directory if this directory exists on current machine.
if exist "%USERPROFILE%\..\" pushd "%USERPROFILE%\..\" & goto RemoveDirectories

rem Make the standard user profiles directory on English Windows XP
rem the current directory if this directory exists on current machine.
if exist "C:\Documents and Settings" pushd "C:\Documents and Settings" & goto RemoveDirectories

rem Make the standard user profiles directory on Windows Vista or later
rem Windows in any language if this directory exists on current machine.
if exist "C:\Users" pushd "C:\Users" & goto RemoveDirectories

goto :EOF

:RemoveDirectories
rem Find in all subdirectories a directory starting with "Test",
rem having next a space character, then an opening parenthesis,
rem any other string (user name) and last a closing parenthesis.
rem It is tested for safety if the directory to delete is really
rem in the programs directory of the start menu directory.

setlocal EnableDelayedExpansion
for /F "tokens=*" %%G in ('dir /A:D /B /S "Test (*)" 2^>nul') do (
    set "TestDirectory=%%~G"
    if not "!TestDirectory:\Start Menu\Programs\Test (=!" == "!TestDirectory!" rmdir /Q /S "%%~G" 2>nul
)
endlocal

rem Restore the previous current directory.
popd

这两个批处理文件都使用 stderr 的重定向到设备 nul 来禁止因找不到目录Test (*)而导致的错误消息(2^>nul命令 dir )或无法删除要删除的目录(2>nul用于命令 rmdir ),例如当它是任何其他进程的当前目录时

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • popd /?
  • pushd /?
  • rem /?
  • rmdir /?
  • set /?
  • setlocal /?