复制文件并输出覆盖文件的目标路径

Copy files and output the target path of the overriden files

我想编写一个批处理,将给定源路径中的所有文件复制到给定输出路径,并绘制实际更改的文件的目标路径。 XCOPY 几乎就是这样做的。它绘制了源路径。

我想使用 PowerShell 会更容易,但我宁愿将它保留在 bat 文件中。

您可以在 xcopy

中与 F 开关一起打印源路径和新的目标路径

考虑这个例子

xcopy * DRIVE-LETTER:\New\ /F

将以这种格式输出

F:\OLD-FOLDER\DSCN.JPG -> F:\New\DSCN.JPG
F:\OLD-FOLDER\DSCN1.JPG -> F:\New\DSCN1.JPG

这个脚本有两个参数:源目录和目标目录 这是一个功能示例。 (您需要自定义输出以满足您的需要。)脚本 不会 检查错误。您可能(或可能不)希望这样做。

@SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF

REM

SET "SRC_PATH=%~1"
SET "DST_PATH=%~2"

MKDIR "%DST_PATH%"

REM  Copy the files
FOR %%f IN (%SRC_PATH%\*.*) DO (
    SET "SRC_FILE=%%~f"
    SET "DST_FILE=%DST_PATH%\%%~nxf"

    @ECHO SOURCE FILE: !SRC_FILE!
    @ECHO DEST FILE  : !DST_FILE!
    COPY "!SRC_FILE!" "!DST_FILE!"
)

REM  Recursively descend into the subdirectories
FOR /D %%d IN (%SRC_PATH%\*.*) DO (
    SET "SRC_SUBDIR=%%~d"
    SET "DST_SUBDIR=%DST_PATH%\%%~nxd"

    @ECHO SOURCE DIR: !SRC_SUBDIR!
    @ECHO DEST DIR  : !DST_SUBDIR!
    cmd /c %~s0 "!SRC_SUBDIR!" "!DST_SUBDIR!"
)

更改 ECHO 语句以执行您需要的操作。

扩展 Sumit 对 /F 选项的建议 - 您可以使用 FOR /F 仅解析出目标文件。不需要批处理脚本。它可以是交互式命令行上的一行。

for /f "delims=> tokens=2" %A in ('xcopy /f "someSourcePath\*.txt" "someDestinationPath"') do @echo %A

以上将在每行输出中包含不需要的前导 space。如果需要,您可以使用额外的 FOR /F 删除前导 space.

for /f "delims=> tokens=2" %A in ('xcopy /f "someSourcePath\*.txt" "someDestinationPath"') do @for /f "tokens=* delims= " %B in ("%A") do @echo %B

无论哪种方式,末尾的文件数也会被删除。

如果将命令放在批处理脚本中,则将所有 % 加倍为 %%

如果您有我的 JREPL.BAT regular expression text processing utility,解决方案会更简单 - 一个纯脚本实用程序(混合 JScript/batch),可以在任何 Windows XP 以后的机器上本地运行。

xcopy /F "someSourcePath\*.txt" "someDestinationPath" | jrepl "> (.*)"  /jmatch

如果你想在最后保留文件数,那么你可以使用更简单的变体

xcopy /F "someSourcePath\*.txt" "someDestinationPath" | jrepl "^.*> " ""