我正在尝试创建一个批处理文件,用于扫描文件夹中的文件
for /R D:\path\import_orders\xml_files\ %%f in (*.xml) do(
copy %%f "\\destination"
if errorlevel 0 move %%f "D:\path\import_orders\xml_files\archive\"
)
已修复 - 但它不起作用。如果我执行它,它只打印第一行代码。 现在有效。我在“do(”之后添加了一个空格,现在它执行了。
1)我的第二个命令好吗?如果第一个命令一切顺利,我想将复制的文件移动到存档中。
2)我应该如何将循环更改为仅对给定目录中的文件而不是其中的子目录起作用?
答案 0 :(得分:3)
您在do
和括号之间缺少空格
对于任何等于或大于n的errorlevel值,构造if errorlevel n
的计算结果为true,因此对于任何非负的errorlevel值,if errorlevel 0
都将为true。您应该使用if not errorlevel 1
引用所有路径是个好习惯,万一有些东西可以包含空格或特殊字符
for /R "D:\path\import_orders\xml_files" %%f in (*.xml) do (
copy "%%~ff" "\\destination"
if not errorlevel 1 move "%%~ff" "D:\path\import_orders\xml_files\archive\"
)
要避免目录递归,只需更改for
循环,删除/R
(请求递归)将开始文件夹提示移动到文件选择模式。
for %%f in ("D:\path\import_orders\xml_files\*.xml") do (
copy "%%~ff" "\\destination"
if not errorlevel 1 move "%%~ff" "D:\path\import_orders\xml_files\archive\"
)
但是在任何情况下copy
命令都不会要求确认目标文件是否存在。如果您不想覆盖现有文件,则可以选择
使用copy
命令
您可以使用/-y
,因此copy
命令会在覆盖文件之前要求确认,并自动执行该过程,您可以回答问题
echo n|copy /-y "source" "target"
这是npocmaka's answer中的方法。这种方法应该没有问题,但
必须两个创建两个cmd
实例来处理管道的每一侧,并为每个源文件执行此操作,因此会减慢进程的速度
如果代码在覆盖问题没有等待N
字符作为否定答案的区域设置上执行,则可能会失败。
首先检查文件存在
您可以使用内置if exist
构造来首先检查目标文件是否存在
if not exist "\\destination\%%~nxf" copy "%%~ff" "\\destination"
其中%%~nxf
,如果正在处理的文件的名称和扩展名
所以,最终的代码可能是
for %%f in ("D:\path\import_orders\xml_files\*.xml") do (
if not exist "\\destination\%%~nxf" copy "%%~ff" "\\destination"
if not errorlevel 1 move "%%~ff" "D:\path\import_orders\xml_files\archive\"
)
答案 1 :(得分:1)
for /R "D:\path\import_orders\xml_files\" %%f in (*.xml) do (
(echo n|copy /-y "%%~ff" "\\destination"|find /i "0 file(s) copied." >nul 2>&1)||(
move "%%~ff" "D:\path\import_orders\xml_files\archive\"
)
)
编辑而不搜索子目录:
for %%f in ("D:\path\import_orders\xml_files\*.xml") do (
(echo n|copy /-y "%%~ff" "\\destination"|find /i "0 file(s) copied." >nul 2>&1)||(
move "%%~ff" "D:\path\import_orders\xml_files\archive\"
)
)