Batch file 如何在复制文件时重命名文件并完成复制

Batch file 如何在复制文件时重命名文件并完成复制,batch-file,vbscript,Batch File,Vbscript,我想创建一个脚本,将文件从一个文件夹复制到另一个文件夹 由于文件的大小可能很大,高达1000 MB,因此可能需要几秒钟的时间 或者一分钟来完全复制它。发生这种情况时,我希望目标文件夹中的文件名以下划线(\ux)作为前缀 将文件完全复制到目标文件夹后,应从文件名中删除。。这样做的目的是确保其他进程不会从目标文件夹中拾取不完整的文件 我们如何使用批处理脚本来实现这一点?目前,我的批处理文件正在复制并将文件移动到另一个文件夹,但我不知道如何在文件完全移动后,在文件名中添加下划线前缀,然后再次删除 这是

我想创建一个脚本,将文件从一个文件夹复制到另一个文件夹

由于文件的大小可能很大,高达1000 MB,因此可能需要几秒钟的时间 或者一分钟来完全复制它。发生这种情况时,我希望目标文件夹中的文件名以下划线(\ux)作为前缀

将文件完全复制到目标文件夹后,应从文件名中删除
。这样做的目的是确保其他进程不会从目标文件夹中拾取不完整的文件

我们如何使用批处理脚本来实现这一点?目前,我的批处理文件正在复制并将文件移动到另一个文件夹,但我不知道如何在文件完全移动后,在文件名中添加下划线前缀,然后再次删除

这是我复制和移动文件的两行代码

copy %1\Customer_*.xml C:\Users\ard\Documents\Folder1
move %1\Customer_*.xml %1\Archive

如果无法使用批处理脚本完成此操作,则VB脚本也应能工作

我的示例使用新名称将src复制到dest,然后恢复旧名称: bn是源文件的基名称

for %%a in (src\*.xml) do (
set bn=%%~nxa
copy %%a dest\!bn!_
rename dest\!bn!_ !bn!
)

我的示例使用新名称从src复制到dest,然后恢复旧名称: bn是源文件的基名称

for %%a in (src\*.xml) do (
set bn=%%~nxa
copy %%a dest\!bn!_
rename dest\!bn!_ !bn!
)

你想要什么,用词来说:

对于
C:\source
中每个受影响的文件:

  • 将文件
    x
    复制到
    C:\destination\\u x
  • 将文件
    C:\destination\\u x
    重命名为
    C:\destination\x
在Windows批处理代码中,还有一些附加功能:

@echo off
setlocal

set "SOURCE=%1"
set "DESTINATION=C:\Users\ard\Documents\Folder1"

for /f "usebackq delims=" %%x in (`dir /b "%SOURCE%\Customer_*.xml"`) do (
    if exist "%DESTINATION%\%%x" (
      echo %%x - already exists at destination
    ) else (
      echo %%x
      copy "%SOURCE%\%%x" "%DESTINATION%\_%%x" > NUL && rename "%DESTINATION%\_%%x" "%%x"
    )
)
注:

  • for
    循环可以逐行迭代命令的输出
  • 在我们的例子中,该命令是
    dir/b“%SOURCE%\*.xml”
    ,即源文件夹中匹配文件的“裸”列表
  • usebackq
    表示命令由反勾号分隔,允许在命令内部使用双引号
  • delims=
    将字段分隔符设置为“none”,否则的
    会将每个文件名拆分为包含空格的标记
  • >NUL
    禁止复制“1个文件”。来自
    复制的成功消息
  • &&
    表示只有在
    复制
    成功时才执行
    重命名

您想要什么,用文字表示:

对于
C:\source
中每个受影响的文件:

  • 将文件
    x
    复制到
    C:\destination\\u x
  • 将文件
    C:\destination\\u x
    重命名为
    C:\destination\x
在Windows批处理代码中,还有一些附加功能:

@echo off
setlocal

set "SOURCE=%1"
set "DESTINATION=C:\Users\ard\Documents\Folder1"

for /f "usebackq delims=" %%x in (`dir /b "%SOURCE%\Customer_*.xml"`) do (
    if exist "%DESTINATION%\%%x" (
      echo %%x - already exists at destination
    ) else (
      echo %%x
      copy "%SOURCE%\%%x" "%DESTINATION%\_%%x" > NUL && rename "%DESTINATION%\_%%x" "%%x"
    )
)
注:

  • for
    循环可以逐行迭代命令的输出
  • 在我们的例子中,该命令是
    dir/b“%SOURCE%\*.xml”
    ,即源文件夹中匹配文件的“裸”列表
  • usebackq
    表示命令由反勾号分隔,允许在命令内部使用双引号
  • delims=
    将字段分隔符设置为“none”,否则
    会将每个文件名拆分为包含空格的标记
  • >NUL
    禁止复制“1个文件”。来自
    复制的成功消息
  • &&
    表示只有在
    复制
    成功时才执行
    重命名

    • 删除前缀并不简单,但删除后缀(新扩展名)很简单。因此,我将附加一个新的扩展名,如
      .inProgress
      。然后,可以使用两个使用通配符的简单命令复制和重命名文件集合

      但是MOVE命令不允许重命名多个文件,因此需要FOR循环。我将展示代码,但我认为在OP的场景中没有必要这样做。在我看来,源文件夹和目标文件夹位于同一个驱动器上,因此移动应该是即时的,不需要使用临时中间名称

      copy "%1\Customer_*.xml" "C:\Users\ard\Documents\Folder1\*.*.inProgress"
      ren "C:\Users\ard\Documents\Folder1\*.inProgress" *.
      
      for %%F in ("%1\Customer_*.xml") do (
        move "%%F" "%1\Archive\%%~nxF.inProgress"
        ren "%1\Archive\%%~nxF.inProgress" *.
      )
      
      有关重命名工作原理的信息,请参见

      请注意,在整个复制操作完成之前,所有复制的文件都将显示为“.inProgress”。如果希望每个文件尽快可用,则副本也需要FOR循环:

      for %%F in ("%1\Customer_*.xml") do (
        copy "%%F" "C:\Users\ard\Documents\Folder1\%%~nxF.inProgress"
        ren "C:\Users\ard\Documents\Folder1\%%~nxF.inProgress" *.
      )
      

      删除前缀并不简单,但删除后缀(新扩展名)很简单。因此,我将附加一个新的扩展名,如
      .inProgress
      。然后,可以使用两个使用通配符的简单命令复制和重命名文件集合

      但是MOVE命令不允许重命名多个文件,因此需要FOR循环。我将展示代码,但我认为在OP的场景中没有必要这样做。在我看来,源文件夹和目标文件夹位于同一个驱动器上,因此移动应该是即时的,不需要使用临时中间名称

      copy "%1\Customer_*.xml" "C:\Users\ard\Documents\Folder1\*.*.inProgress"
      ren "C:\Users\ard\Documents\Folder1\*.inProgress" *.
      
      for %%F in ("%1\Customer_*.xml") do (
        move "%%F" "%1\Archive\%%~nxF.inProgress"
        ren "%1\Archive\%%~nxF.inProgress" *.
      )
      
      有关重命名工作原理的信息,请参见

      请注意,在整个复制操作完成之前,所有复制的文件都将显示为“.inProgress”。如果希望每个文件尽快可用,则副本也需要FOR循环:

      for %%F in ("%1\Customer_*.xml") do (
        copy "%%F" "C:\Users\ard\Documents\Folder1\%%~nxF.inProgress"
        ren "C:\Users\ard\Documents\Folder1\%%~nxF.inProgress" *.
      )
      

      set bn=%%~nxa
      会更好(它还将删除对
      enabledelayedexpansion
      的依赖),这仍然需要“setlocal enabledelayedexpansion”。不需要“bn”变量——去掉它,您就不需要延迟扩展,也不需要错误处理。例如:复制%%a dest\%%~nxa>nul | |(回显失败!%%a&exit/b 1)
      set bn=%%~nxa
      会更好(它还将删除对
      enabledelayedexpansion
      的依赖性),这仍然需要“setlocal enabledelayedexpansion”。不需要“bn”变量——去掉它,您就不需要延迟扩展,也不需要错误处理。例如:copy%%a dest\%%~nxa>nul | | |(echo失败!%%a&exit/b 1)@joeking这似乎不是一个完整的问题。好的,如果复制或重命名失败会发生什么