复制文件并输出覆盖文件的目标路径
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 "^.*> " ""
我想编写一个批处理,将给定源路径中的所有文件复制到给定输出路径,并绘制实际更改的文件的目标路径。 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 "^.*> " ""