如何复制与某些指定名称不匹配的文件夹,使用批次
我试图创建一个脚本来复制“C:\”中的文件夹,这些文件夹与使用批处理文件的某些特定名称不匹配。如何复制与某些指定名称不匹配的文件夹,使用批次
例如,比方说,我们有以下文件夹:
- C:\ WINDOWS
- C:\ Program Files文件(x86)的
- C:\查理
- C:\亚当
- C:\ PROGRAM数据
- C:\ DRIVERS
- C:\ Perflogs中
- 等
因为Windows',
程序文件(x86)`,'程序数据','驱动程序'等。是由我们的标准图像创建的文件夹,我们不必复制它们,但只需要复制“亚当”和“查理”文件夹。我们知道所有这些系统生成的文件夹的名称是什么。
在这里和论坛上有很多答案,这些答案显示了通配符搜索匹配(例如下面)要做什么,但在这种情况下,我希望文件夹与给定名称不匹配,并在它们旁边有箭头下面的图片。 [![箭头显示需要复制的内容] [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
)
)
谢谢Ken,非常感谢。 – user3839914
感谢肯,它确实有效,但我遇到了一些性能问题。 – user3839914
你能更具体一点吗?注意你想关闭回声......并且注意ERRORLEVEL是一个特殊的变量 - 没有%使用... –
有很多的可能性,以一个驱动器的所有文件夹复制到另一个驱动器,例如用于备份操作,除了一些指定的文件夹。
这里是一个解决方案,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
上部是只为找出如果一个USB硬盘的文件夹DataBackup
在当前插入的,什么是它的驱动信。
该批处理文件的用户会收到有关数据备份文件夹丢失的USB硬盘的通知,并可以通过按键N(不区分大小写)取消备份操作。或者用户按下键Y,并找到另一种方法找到备份硬盘。 10秒后,批处理文件将自动回复Y
的提示,并提供另一种方法来查找备份驱动器。
根据问题的部分与所述命令行启动:
for /D %%D in (%SystemDrive%\*) do :BackupFolder "%%D"
的FOR在系统的根每个非隐藏目录循环调用驱动子程序BackupFolder
与目录作为参数的名称。
下一行用命令注释掉REM也会处理带有隐藏属性集的系统驱动器根目录。
一旦循环完成处理系统驱动器上的所有(非隐藏)文件夹,批处理文件执行将通过命令goto :EOF
退出,避免掉落到批处理文件主代码下面的子例程BackupFolder
。
该子程序BackupFolder
包含几个不区分大小写的传递文件夹名称与预定义字符串跳过Windows标准文件夹路径的比较。 Windows目录,包括程序文件目录以及回收站和系统还原的隐藏目录均通过退出子程序goto :EOF
进行正字符串比较而跳过。
否则将带有存档属性集的传递文件夹的所有文件和子文件夹复制到USB硬盘上的数据备份文件夹,并删除源文件夹中文件的存档属性,以防止未来一次又一次复制相同的未修改文件。
所以XCOPY命令的副本,因为此批处理文件的最后一次执行备份硬盘从而减少备份所需的总时间只是新的或修改的文件和文件夹。
虽然有很多其他的可能性来从备份操作中排除文件和文件夹,但我更喜欢这种方法,因为它很容易复制其中一个if /I "%~1" == "..." goto :EOF
命令行,并修改右侧的字符串以忽略多一个文件或夹。通过在标签RunBackup
以下的命令块中调用BackupFolder
以获得其他文件夹,可以轻松复制其他驱动器中的更多文件夹。
请注意,此批处理文件不会删除备份驱动器上不再存在的源文件夹中的文件和文件夹。因此,备份驱动器上的文件/文件夹清理必须经常手动完成。这是为了安全起见,如果源文件夹中的文件/文件夹被错误地删除,并且不能立即识别,并且使用备份硬盘恢复文件/文件夹,则会防止自动删除备份文件/文件夹。
为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
choice /?
cls /?
del /?
dir /?
echo /?
for /?
goto /?
if /?
rem /?
type /?
wmic /?
wmic logicaldisk /?
wmic logicaldisk get /?
xcopy /?
阅读也是微软的文章关于Using Command Redirection Operators和Single line with multiple commands using Windows batch file答案。
感谢一吨莫菲。欣赏它。 – user3839914
你是什么意思的常规文件夹?你能否试着解释你到底想要复制的是什么?你只是想从个人用户配置文件目录复制,只是非系统目录或其他东西。 – Compo
对不起,我的意思是说,Windows,程序文件,程序文件(x86),用户,ProgramData等经常由系统创建,我只想为用户创建的文件夹创建备份,以防他们创建个人文件夹 – user3839914
因此,你的问题太广泛了,没有办法,一个简单或相对复杂的命令可以很容易地区分用户创建的文件和目录,系统创建的文件,具有用户权限的文件和目录,用户在创建系统时创建的内容等。即使检查已创建的内容,或在特定日期后修改,也不会隔离您所需的内容。 – Compo