我想创建一个脚本,该脚本应该将文件从一个文件夹复制到另一个文件夹。
由于文件大小可达1000 MB,因此可能需要几秒钟 或一分钟完全复制它。在发生这种情况时,我希望目标文件夹中的文件名以下划线(_)作为前缀。
将文件完全复制到目标文件夹后,应从文件名中删除_
。这样做的目的是确保另一个进程不应从目标文件夹中获取不完整的文件。
我们如何使用批处理脚本执行此操作?目前我的批处理文件正在复制并将文件移动到另一个文件夹,但我不知道如何在文件完全移动后使用下划线作为前缀,然后再从文件名中删除。
这是我的2行代码,它复制并移动文件。
copy %1\Customer_*.xml C:\Users\ard\Documents\Folder1
move %1\Customer_*.xml %1\Archive
如果不能使用批处理脚本完成,那么VB脚本也可以正常工作
答案 0 :(得分:2)
你想要的是什么,用文字:
对于C:\source
中的每个受影响的文件:
x
复制到C:\destination\_x
C:\destination\_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”,否则for
会将每个文件名拆分为包含空格的标记> NUL
禁止复制“1个文件”。来自copy
&&
表示rename
仅在copy
成功时执行答案 1 :(得分:2)
删除前缀并非易事,但删除后缀(新扩展名)很简单。所以我会添加一个像.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" *.
)
有关重命名工作原因的信息,请参阅How does the Windows RENAME command interpret wildcards?。
请注意,所有复制的文件都会显示为" .inProgress"直到整个COPY操作完成。如果您希望每个文件尽快可用,那么COPY也需要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" *.
)
答案 2 :(得分:1)
我的示例使用新名称从src复制到dest,然后恢复旧名称: bn是源文件的基名。
for %%a in (src\*.xml) do (
set bn=%%~nxa
copy %%a dest\!bn!_
rename dest\!bn!_ !bn!
)