批处理如果定义不工作

Batch IF DEFINED Not Working

我正在尝试使用批处理从我的用户区自动删除某些文件夹。我已选择使用 if defined 技巧过滤任何应删除的文件夹。

但是,以下代码只是删除所有文件夹。

for /f "usebackq delims=|" %%f in (`dir /b /ad`) do (
    set "true="
    if not "%%f"=="Custom Office Templates"     set true=1
    if not "%%f"=="Desktop"                     set true=1
    if not "%%f"=="Downloads"                   set true=1
    if not "%%f"=="Favourites"                  set true=1
    if not "%%f"=="Links"                       set true=1
    if not "%%f"=="My Documents"                set true=1
    if not "%%f"=="My Music"                    set true=1
    if not "%%f"=="My Pictures"                 set true=1
    if not "%%f"=="My Videos"                   set true=1
    if defined true (
        rd %%f
    )
)

请帮忙!

正如其他人在他们的评论中暗示的那样 - 你的逻辑是错误的。

您的每个 IF 语句都可以 return FALSE 只有一个特定的文件夹名称。因此,如果其中一个 IF 语句为假,您可以保证所有其他语句都为真。所以你想一想,很明显每次都会删除所有文件夹。

还有,你从来没有undefined TRUE。因此,一旦为一个文件夹设置,它将对所有其他文件夹保持设置。

如果您只想删除列出的文件夹,则:

for %%A in (
  "Custom Office Templates"
  "Desktop"                
  "Downloads"              
  "Favourites"             
  "Links"                  
  "My Documents"           
  "My Music"               
  "My Pictures"            
  "My Videos"              
) do rd %%A

如果要删除所有现有文件夹除了列出的文件夹,那么

for /d %%A in (*) do (
  set "exclude="
  for %%B in (
    "Custom Office Templates"
    "Desktop"                
    "Downloads"              
    "Favourites"             
    "Links"                  
    "My Documents"           
    "My Music"               
    "My Pictures"            
    "My Videos"              
  ) do if /i "%%A" equ "%%~B" set exclude=1
  if not defined exclude rd "%%A"
)

请注意,如果文件夹不为空,RD 将失败。如果您使用

,您可以通过删除文件夹中的所有内容来强制它成功
rd /s /q "%%A"