如何使用 Batch 复制与某些指定名称不匹配的文件夹

How to copy folders which don't match some specified names, using Batch

我正在尝试创建一个脚本来复制 "C:\" 中的文件夹,这些文件夹与使用批处理文件的某些特定名称不匹配。

例如假设我们有以下文件夹:

因为 Windows',Program Files (x86)`、'Program Data'、'Drivers'...等。是我们标准镜像创建的文件夹,我们不用复制,只想复制"Adam"和"Charlie"文件夹。我们知道所有这些系统生成的文件夹的名称是什么。

这里和论坛上有很多答案,它们显示了如何进行通配符搜索匹配(例如下面),但在这种情况下,我希望文件夹不匹配给定的名称,旁边有箭头,因为根据下图。 [![箭头表示需要复制的内容][1]][1]

我试过使用类似的东西,但是使用这个选项意味着编译器甚至正在搜索子文件夹,因为它正在检查 C:\Windows*此位置中的所有内容**,这是非常耗时的。

FOR /D %%G in ( "C:\*" ) DO ( 
IF /I %%G NEQ "C:\Windows" (
    IF /I %%G NEQ "C:\Drivers" (
        IF /I %%G NEQ "C:\inetpub" (
            IF /I %%G NEQ "C:\Intel" (
                IF /I %%G NEQ "C:\MSOCache" (
                    IF /I %%G NEQ "C:\PerfLogs" (

这会让您朝着正确的方向前进:

FOR /D %%G in ( "C:\*" ) DO ( 
  IF /I %%G NEQ C:\Windows (
    echo %%G | FINDSTR /I /R ".*program.files.*" > NUL
    IF ERRORLEVEL 1 echo do something with %%G 
  )
)

有很多方法可以将一个驱动器的所有文件夹复制到另一个驱动器,例如用于备份操作,但某些指定的文件夹除外。

这是适用于 Windows XP 和任何更新的 Windows 版本的解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

:FindDrive
cls
echo Searching for external USB hard disk for backup ...

for /F "skip=2 delims=" %%H in ('%SystemRoot%\System32\wbem\wmic.exe LOGICALDISK GET DeviceID^,DriveType /Format:CSV') do for /F "tokens=2,3 delims=," %%I in ("%%H") do if "%%J" == "3" if exist "%%I\DataBackup\" set "BackupDrive=%%I" & goto RunBackup

echo/
echo Could not find USB hard disk with folder DataBackup.
echo/
if exist %SystemRoot%\System32\choice.exe goto UseChoice

setlocal EnableDelayedExpansion
:UseSetPrompt
set "UserChoice=Y"
set /P "UserChoice=Try again (Y/n): "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & exit /B
if /I "!UserChoice!" == "Y" endlocal & goto FindDrive
goto UseSetPrompt

:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /T 10 /D Y /M "Try again (Y/n):"
if errorlevel 2 exit /B
goto FindDrive

:RunBackup
echo USB hard disk detected as drive %BackupDrive%

for /D %%D in (%SystemDrive%\*) do :BackupFolder "%%D"
rem for /F "eol=| delims=" %%D in ('dir %SystemDrive%\* /AD-L /B 2^>nul') do call :BackupFolder "%SystemDrive%\%%D"
exit /B

:BackupFolder
if /I "%~1" == "%SystemRoot%" goto :EOF
if /I "%~1" == "%ProgramFiles%" goto :EOF
if /I "%~1" == "%ProgramFiles(x86)%" goto :EOF
if /I "%~1" == "%SystemDrive%$RECYCLE.BIN" goto :EOF
if /I "%~1" == "%SystemDrive%\System Volume Information" goto :EOF
echo/
echo Creating backup of folder "%~1" ...
echo/
%SystemRoot%\System32\xcopy.exe "%~1\*" "%BackupDrive%\DataBackup\%~nx1\" /C /E /H /I /K /M /Q /R /Y
goto :EOF

上半部分只是为了查看当前是否插入了文件夹为DataBackup的USB硬盘,其盘符是多少。

批处理文件的用户会被通知丢失了带有数据备份文件夹的USB硬盘,并且可以按N键取消备份操作(不区分大小写) .或者用户按下Y键,又是一种查找备份硬盘的方法。 10 秒后,批处理文件会自动用 Y 回答提示,并使用另一种方法在 choice.exe 上找到备份驱动器,这是自 Windows Vista 和 Windows 以来的情况Server 2003,但默认情况下不在 Windows XP 上。

问题部分以命令行开头:

for /D %%D in (%SystemDrive%\*) do :BackupFolder "%%D"

FOR 循环为系统驱动器根目录中的每个非隐藏目录调用子例程BackupFolder,并以目录名称作为参数。

用命令 REM 注释掉的下一行还将处理系统驱动器根目录中具有隐藏属性集的目录。

一旦循环处理完系统驱动器上的所有(非隐藏)文件夹,批处理文件执行将退出命令 exit /B 避免落入主代码下面的子例程 BackupFolder批处理文件。

子例程 BackupFolder 在顶部包含几个不区分大小写的执行比较,将传递的文件夹名称与带有预定义字符串的路径进行比较,以跳过 Windows 标准文件夹。 Windows 目录、程序文件目录以及回收站和系统还原的隐藏目录都可以通过在正字符串比较时使用 goto :EOF 退出子例程来跳过。

否则将设置存档属性的已通过文件夹的所有文件和子文件夹复制到USB硬盘上的数据备份文件夹中,并删除源文件夹中文件的存档属性,以防止重复复制相同的未修改文件未来。

因此 XCOPY 命令仅将自上次执行此批处理文件以来新的或修改的文件和文件夹复制到备份硬盘,从而减少了备份所需的总时间。

虽然还有很多其他方法可以从备份操作中排除文件和文件夹,但我更喜欢这种方法,因为它很容易复制 if /I "%~1" == "..." goto :EOF 命令行之一并修改右侧的字符串忽略一个文件或文件夹。通过在标签 RunBackup 下方的命令块中调用 BackupFolder 可以轻松复制来自其他驱动器的更多文件夹。

请注意,此批处理文件永远不会删除源文件夹中不再存在的备份驱动器上的文件和文件夹。因此,必须不时手动对备份驱动器进行 file/folder 清理。这是为了安全起见,如果源文件夹中的 file/folder 被错误删除并且没有立即被识别并且 file/folder 使用备份硬盘恢复,则防止自动删除备份 file/folder。

也可以使用 %SystemRoot%\System32\robocopy.exe 多次使用选项 /XD 来排除 Windows Vista 和 Windows Server 2003 及更高版本的目录 client/server 版本的 Windows 默认安装 robocopy.exerobocopy.exe 在 Windows XP 上默认不存在,但可以像 choice.exe 一样从 Windows Server 2003 的系统目录中复制,使用与 Windows XP 相同的内核版本到Windows XP的系统目录。

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

  • choice /?
  • cls /?
  • dir /?
  • echo /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • robocopy /?
  • type /?
  • wmic /?
  • wmic logicaldisk /?
  • wmic logicaldisk get /?
  • xcopy /?

另请阅读有关 Using command redirection operators and my answers on Single line with multiple commands using Windows batch file and How can I make an "are you sure" prompt in a Windows batch file?

的 Microsoft 文章