我搜索了很多次如何将不同扩展名的所有文件从一个文件夹及其所有子文件夹复制到一个新文件夹,而不复制文件夹本身批处理文件。 我是说仅限文件。
我有一个非常庞大的(嵌套)目录结构,也就是文件夹中的文件夹。我试过Robocopy但没用。然后我发现了一个代码复制我也试过C#但它需要太多时间才能完成。
如果您有任何其他建议,请在此推荐。
答案1
我会选择电源外壳如果你使用任何类似于现代 Windows 系统的东西。你所问的问题最简单的版本是:
$source = 'C:\Users\source'
$dest = 'C:\Users\destination'
$filter = '*.txt'
Get-ChildItem $Source $filter -recurse | Copy-Item -Destination $dest
要按日期过滤项目,请将结果输入到Get-ChildItem
到Where-Object
(别名:Where
或?
)在管道传输到Copy-Item
。
$Cutoff = [DateTime]'3/1/20'
Get-ChildItem $Source $filter -recurse |
Where CreationTime -gt $CutOff |
Copy-Item -Destination $dest
这日期相关属性IO.FileSystem 对象有:
- 创建时间
- 最后访问时间
- 最后写入时间
您可以使用任何比较运算符。
对于重复操作,您可能需要计算当前日期的截止时间:
- 自午夜起:
(Get-Date).Date
- 过去 24 小时:
(Get-Date).AddDays(-1)
- 前一天午夜
(Get-Date).AddDays(-1).Date
答案2
然后我找到了一个解决方案,我认为它比任何其他方法都更容易、更快捷。
@ECHO OFF
SET "source=C:\Users\source"
SET "dest=C:\Users\destination"
SET "FileList=*.txt"
SET "dupCnt=1"
FOR /R "%source%" %%A IN (%FileList%) DO (
IF NOT EXIST "%dest%\%%~NXA" (
XCOPY /F /Y "%%~FA" "%dest%\" && IF EXIST "%%~FA" /Q /F "%%~FA"
) ELSE (
CALL :DupeRoutine "%%~FA" "%%~NA" "%%~XA"
)
)
GOTO :EOF
:DupeRoutine
IF EXIST "%dest%\%~2_(%dupCnt%)%~3" (
SET /A dupCnt=%dupCnt%+1
CALL :DupeRoutine "%~1" "%~2" "%~3"
) ELSE (
IF NOT EXIST "%dest%\%~2_(%dupCnt%)%~3" ECHO F | XCOPY /Y /F "%~1" "%dest%\%~2_(%dupCnt%)%~3" /Q /F "%~1"
SET "dupCnt=1"
)
GOTO :EOF
还有另一件事,如果您想复制某个日期之后的文件,那么请将日期放入此查询中,如下所示:
11号线
XCOPY /D /D:06-05-2020 /F /Y "%%~FA" "%dest%\" && IF EXIST "%%~FA" /Q /F "%%~FA"
23 号线
IF NOT EXIST "%dest%\%~2_(%dupCnt%)%~3" ECHO F | XCOPY /D /D:06-05-2020 /Y /F "%~1" "%dest%\%~2_(%dupCnt%)%~3" /Q /F "%~1"
日期采用以下格式月-日-年,您还可以添加其他文件扩展名文件列表=