【问题标题】:Windows bat file remove all file and folder excluding some file and folderWindows bat 文件删除所有文件和文件夹,不包括某些文件和文件夹
【发布时间】:2015-08-14 10:41:16
【问题描述】:

我想删除一个目录中的文件和文件夹,不包括bat文件中的一些文件和文件夹。

我需要保留这些文件,update.bat FolderName.zip FolderName 和所有其他文件都应该从目录中删除,

我编写了 .bat 文件,但似乎 FolderName 也被从目录中删除,其余工作正常。

谁能说出下面的脚本有什么问题?

attrib +r update.bat
attrib +r FolderName.zip
attrib +r FolderName
for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
attrib -r update.bat
attrib -r FolderName.zip
attrib -r FolderName

谢谢 哈里斯

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    您误解了“只读”对 Windows 中文件夹的作用。这不是你的错。这是一个误导性的标签。文件夹上的“只读”使文件夹的所有文件只读,but not the folder itself

    注意

    将文件夹设置为只读会使文件夹中的所有文件变为只读。它不会影响文件夹本身。

    对于引用 Vista 文档,我深表歉意,我无法为 Windows 7 找到类似的文件夹页面。但 UI 中提到了它:


    我们如何解决这个问题?

    我们还将设置system 属性。

    attrib +r update.bat
    attrib +r FolderName.zip
    attrib +r +s FolderName
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
    attrib -r update.bat
    attrib -r FolderName.zip
    attrib -r -s FolderName
    

    使用示例:

    在运行更新之前,我的目录包含以下内容:

    <DIR>   FolderName
            FolderName.zip
            New Bitmap Image.bmp
    <DIR>   New folder
            New Microsoft Word Document.docx
            New Text Document (2).txt
            New Text Document (3).txt
            New Text Document.txt
            update.bat
    

    执行update.bat后,目录现在是这样的:

    <DIR>   FolderName
            FolderName.zip
            update.bat
    

    【讨论】:

    • 您好,感谢您的详细回答,实际上这是我第一次在 Windows 中编写脚本。现在在运行时,该文件夹没有被删除,但我收到了类似E:\Qt_Project\Newfolder\a&gt;update.bat The directory name is invalid. E:\Qt_Project\Newfolder\a\FolderName.zip Access is denied. The directory name is invalid. 的消息,这是预期的吗?
    • 我对脚本所做的更改不会影响您对 .zip 文件所做的更改。是不是由运行批处理文件的用户创建的?可能没有设置允许您修改属性的权限。
    • 是的,zip 文件是从服务器下载的。我的最终目的是更新我的应用程序,因为我从服务器下载了 zip 文件,现在将其解压缩到我当前应用程序所在的文件夹。然后从应用程序目录中删除所有文件和文件夹(除了批处理文件(用于执行所有这些操作),新下载的zip文件,提取的文件夹),然后将新提取的应用程序文件复制回当前目录,然后启动应用程序。跨度>
    【解决方案2】:

    虽然它通常用于复制文件,但通过正确的设置robocopy 也可以处理文件/文件夹的删除。所需要的只是一个空文件夹作为源,您的文件夹作为目标清除,/purge 开关将删除目标中不存在于源中的所有文件。使用/xf(排除文件)和/xd(排除目录)开关处理文件和文件夹保留

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "target=%~1"
        if not defined target set "target=%cd%"
    
        set "excludedFiles=update.cmd foldername.zip"
        set "excludedFolders=folderName"
    
        2>nul (
            for %%a in ("%temp%\%~nx0.%random%%random%%random%.tmp") do (
                md "%%~fa" 
                robocopy "%%~fa" "%target%\." /l /s /e /nocopy /purge /xf %excludedFiles% /xd %excludedFolders%
                rmdir /s /q "%%~fa" 
            )
        )
    

    robocopy 命令包含一个/l 开关,用于仅列出操作中涉及的文件/文件夹。如果一切正常,请删除 /l 以执行文件/文件夹删除。

    【讨论】:

      【解决方案3】:

      您可以尝试使用带同步目录选项的 TotalCommander,为同步创建一个空文件夹。

      【讨论】:

      • 尝试为您的答案提供更多解释。请参阅 How to answer page 以帮助您改进答案。
      • 您要回答的问题需要在批处理文件中工作的解决方案,您建议使用可能更难自动运行的 GUI 工具
      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多