如何基于PREFIXES的列表(txt)批量复制文件

时间:2015-08-08 15:31:04

标签: windows batch-file cmd copy xcopy

我的文件名包含一些标准化的前缀。通常,格式为yyyy-99999-xx

文件名示例:

2015-12345-NY-0 Coney Island
2015-12345-NY-1 Coney Island
2015-54321-NY Coney Island

如您所见,可能有多个文件包含相同的字符1n。我想通过搜索.txt文件列表中包含的前缀来复制文件夹中的文件。

基本上,我想“优化/扩展”Batch: Copy a list (txt) of files 中显示的流程,以便file-list.txt - 我已更改为Prefix-List.txt - 仅包含文件名“前缀”要复制的文件。我必须将 xcopy 切换为/K才能复制任何文件。

此外,我想将错误重定向到Errors.txt

“很高兴”会在搜索中包含子文件夹。

使用上面的文件名示例:

2015会复制3个文件 2015-12345-NY会复制2个文件 2015-12345-NY-1会复制1个文件。

这是我的.bat文件

set src_folder=d:\JAR\source
set dst_folder=d:\JAR\destination
for /f "tokens=*" %%i in (File-list.txt) DO (
    xcopy /K "%src_folder%\%%i" "%dst_folder%"
)

Mofi的解决方案正是我所要求的。现在,我想通过更改目标目录名称来扩展一点。添加日期时间前缀。

我有2个问题      1.如何获得Mon = 08(而不是8月)?
     2.使用变量的MKDIR的语法是什么?

这是我正在使用的编码(从Windows batch: formatted date into variable修改)。

 @echo off
 setlocal 
 for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \  /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
 set "dow=%%D"
 set "month=%%E"
 set "day=%%F"
 set "HH=%%G"
 set "MM=%%H"
 set "SS=%%I"
 set "year=%%J"
 SET "DESTINATION=%%J%%E%%F%%G%%H%%I-EXTRACTION"
)

 echo Day of the week: %dow%
 echo Day of the month : %day%
 echo Month : %month%
 echo hour : %HH%
 echo minutes : %MM%
 echo seconds : %SS%
 echo year : %year%
 echo DESTINATION : %DESTINATION%

 endlocal

 MKDIR {"%DESTINATION%"}

2 个答案:

答案 0 :(得分:0)

这并没有很多测试,但它可能指向正确的方向。

set src_folder=d:\JAR\source
set dst_folder=d:\JAR\destination
for /f "tokens=*" %%i in (File-list.txt) DO (
    for /f "usebackq tokens=*" %%k in (`dir /s /b "%src_folder%\%%i*") DO
        xcopy /K "%%k" "%dst_folder%"
    )
)

答案 1 :(得分:0)

以下是我对这个带有注释的小批处理文件的建议:

@echo off
rem Define source and destination directory.
set "src_folder=d:\JAR\source"
set "dst_folder=d:\JAR\destination"

rem Delete error log file from a previous run.
del Errors.txt 2>nul

rem Copy all files in all subdirectories matching
rem any prefix string in prefix list text file.
for /F "delims=" %%i in (Prefix-List.txt) do (
    xcopy "%src_folder%\%%i*" "%dst_folder%" /C /H /I /K /Q /R /S /Y >nul 2>>Errors.txt
)

rem Delete Errors.txt if it is empty because of no error.
for %%F in (Errors.txt) do if %%~zF == 0 del Errors.txt

但是我怀疑你对错误信息感到满意,因为 xcopy 错误消息在没有将复制的文件打印到控制台并将它们全部重定向到文本文件中时实际上没用。

有关used命令的详细信息,请打开命令提示符窗口,在此处运行以下命令并阅读所有输出帮助页面。

  • del /?
  • for /?
  • if /?
  • set /?
  • xcopy /?

扩展:

  1. 使源文件夹成为执行时通过第一个参数传递给批处理文件的变量 如果在没有参数的情况下执行批处理文件,则显示错误消息 如果指定的源文件夹不存在,则显示错误消息。

  2. 目标目录的前缀yyyy-mm-dd_与本地日期格式无关。

  3. 上述批处理文件的此修改版本包含两个扩展名:

    @echo off
    rem Check first parameter of batch file.
    if "%~1" == "" goto NoSourceFolder
    if not exist "%~1" goto SourceNotExist
    if not exist Prefix-List.txt goto NoPrefixList
    
    setlocal
    rem Define source directory based on parameter.
    set "src_folder=%~1"
    
    rem Get local date and time in a language independent format.
    for /F "tokens=2 delims==." %%T in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "LocalDate=%%T"
    
    rem Define local date in format yyyy-mm-dd.
    set "LocalDate=%LocalDate:~0,4%-%LocalDate:~4,2%-%LocalDate:~6,2%"
    
    rem Define destination directory with date prefix.
    set "dst_folder=d:\JAR\%LocalDate%_destination"
    
    rem Delete error log file from a previous run.
    del Errors.txt 2>nul
    
    rem Copy all files in all subdirectories matching
    rem any prefix string in prefix list text file.
    for /F "delims=" %%i in (Prefix-List.txt) do (
        xcopy "%src_folder%\%%i*" "%dst_folder%" /C /H /I /K /Q /R /S /Y >nul 2>>Errors.txt
    )
    
    rem Delete Errors.txt if it is empty because of no error.
    for %%F in (Errors.txt) do if %%~zF == 0 del Errors.txt
    endlocal
    goto :EOF
    
    :NoSourceFolder
    echo %~nx0: Missing source folder name as first parameter.
    goto HaltOnError
    
    :SourceNotExist
    echo %~nx0: There is no folder "%~1".
    goto HaltOnError
    
    :NoPrefixList
    echo %~nx0: There is no file "%CD%\Prefix-List.txt".
    
    :HaltOnError
    echo.
    pause
    

    感谢Jay获取How to get current datetime on Windows command line, in a suitable format for using in a filename?

    的答案

    有关%~1%~nx0在命令提示符窗口call /?中运行并阅读所有输出帮助页面的详细信息,另请阅读What does %~dp0 mean, and how does it work?