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

时间:2017-10-14 02:55:28

标签: batch-file for-loop cmd wildcard

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

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

  • C:\视窗
  • C:\ Program Files(x86)
  • C:\查理
  • C:\亚当
  • C:\ Program Data
  • C:\驱动程序
  • C:\ Perflogs中

因为Windows',程序文件(x86)`,'程序数据','驱动程序'......等等。是我们的标准图像创建的文件夹,我们不必复制它们,但只想复制“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" (

2 个答案:

答案 0 :(得分:1)

这应该让你朝着正确的方向前进:

UninstallReinstallCancel

答案 1 :(得分:1)

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

以下是适用于Windows XP和以后任何Windows版本的解决方案:

@echo off

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

%SystemRoot%\System32\wbem\wmic.exe LOGICALDISK GET DeviceID,DriveType /Format:CSV >"%TEMP%\DataBackup.tmp"

for /F "skip=2 tokens=2,3 delims=," %%A in ('type "%TEMP%\DataBackup.tmp"') do (
    if "%%B" == "3" if exist "%%A\DataBackup\" set "BackupDrive=%%A" & goto RunBackup
)

del "%TEMP%\DataBackup.tmp"
echo/
echo Could not find USB hard disk with folder DataBackup.
echo/
%SystemRoot%\System32\choice.exe /C YN /N /T 10 /D Y /M "Try again (Y/n): "
if errorlevel 2 goto :EOF
goto FindDrive


:RunBackup
del "%TEMP%\DataBackup.tmp"
echo USB hard disk detected as drive %BackupDrive%

for /D %%D in (%SystemDrive%\*) do :BackupFolder "%%D"
rem for /F "delims=" %%D in ('dir %SystemDrive%\* /AD /B 2^>nul') do call :BackupFolder "%SystemDrive%\%%D"
goto :EOF


: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回复提示,并再一次查找备份驱动器。

根据问题的部分从命令行开始:

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

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

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

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

子例程BackupFolder包含几个不区分大小写的传递文件夹名称的比较,其中路径包含预定义字符串以跳过Windows标准文件夹。 Windows目录,程序文件目录以及回收站和系统还原的隐藏目录都会跳过子程序goto :EOF进行正字符串比较。

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

因此, XCOPY 命令仅将上次执行此批处理文件后的新文件和文件夹复制到备份硬盘,这样可以减少备份所需的总时间。

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

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

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

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

另请阅读有关Using Command Redirection Operators的Microsoft文章以及Single line with multiple commands using Windows batch file上的答案。

相关问题