Windows 在批处理脚本中设置for循环

Windows 在批处理脚本中设置for循环,windows,batch-file,for-loop,Windows,Batch File,For Loop,我正在尝试创建一个批处理文件,用于扫描文件夹中的文件 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”之后添加了一个空格(“现在执行)。

我正在尝试创建一个批处理文件,用于扫描文件夹中的文件

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) 我应该如何更改循环,使其仅对给定目录中的文件工作,而不对其中的子目录工作

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\"
    )
)
编辑而不搜索子目录:

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\"
    )
)
  • do
    和括号之间缺少空格

  • 对于等于或大于n的任何errorlevel值,如果errorlevel n,则构造
    将被评估为true,因此对于任何非负errorlevel值,
    如果errorlevel 0
    将被评估为true。如果不是错误级别1,则应使用

  • 引用所有路径是一个好习惯,以防某些内容可能包含空格或特殊字符

对于(*.xml)中的/R“D:\path\import_orders\xml_files”%%f(
复制“%%~ff”“\\destination”
如果不是错误级别1,请移动“%%~ff”D:\path\import\u orders\xml\u files\archive\”
)
要避免目录递归,只需更改
for
循环,删除
/R
(要求递归)将开始文件夹提示移动到文件选择模式

对于%%f in(“D:\path\import\u orders\xml\u files\*.xml”)执行以下操作(
复制“%%~ff”“\\destination”
如果不是错误级别1,请移动“%%~ff”D:\path\import\u orders\xml\u files\archive\”
)
但在任何情况下,
copy
命令都不会要求确认目标文件是否存在。如果您不想覆盖现有文件,您有一些选项

使用
复制
命令的开关

您可以使用
/-y
,因此
copy
命令将在覆盖文件之前请求确认,并且为了自动化该过程,您可以通过管道将问题的答案传递给用户

echo n|copy /-y "source" "target"
这是本报告中的方法。这种方法应该没有问题,但是

  • 有必要创建两个
    cmd
    实例来处理管道的每一侧,并对每个源文件执行此操作,这样会减慢处理过程

  • 如果代码在覆盖问题未等待
    N
    字符作为否定答案的区域设置上执行,则可能会失败

首先检查文件是否存在

您可以使用内置的
if exist
构造首先检查目标文件是否存在

if not exist "\\destination\%%~nxf" copy "%%~ff" "\\destination"
其中
%%~nxf
如果正在处理的文件的名称和扩展名

因此,最终的代码可能是

对于%%f in(“D:\path\import\u orders\xml\u files\*.xml”)执行以下操作(
如果不存在“\\destination\%%~nxf”复制“%%~ff”“\\destination”
如果不是错误级别1,请移动“%%~ff”D:\path\import\u orders\xml\u files\archive\”
)
  • do
    和括号之间缺少空格

  • 对于等于或大于n的任何errorlevel值,如果errorlevel n,则构造
    将被评估为true,因此对于任何非负errorlevel值,
    如果errorlevel 0
    将被评估为true。如果不是错误级别1,则应使用

  • 引用所有路径是一个好习惯,以防某些内容可能包含空格或特殊字符

对于(*.xml)中的/R“D:\path\import_orders\xml_files”%%f(
复制“%%~ff”“\\destination”
如果不是错误级别1,请移动“%%~ff”D:\path\import\u orders\xml\u files\archive\”
)
要避免目录递归,只需更改
for
循环,删除
/R
(要求递归)将开始文件夹提示移动到文件选择模式

对于%%f in(“D:\path\import\u orders\xml\u files\*.xml”)执行以下操作(
复制“%%~ff”“\\destination”
如果不是错误级别1,请移动“%%~ff”D:\path\import\u orders\xml\u files\archive\”
)
但在任何情况下,
copy
命令都不会要求确认目标文件是否存在。如果您不想覆盖现有文件,您有一些选项

使用
复制
命令的开关

您可以使用
/-y
,因此
copy
命令将在覆盖文件之前请求确认,并且为了自动化该过程,您可以通过管道将问题的答案传递给用户

echo n|copy /-y "source" "target"
这是本报告中的方法。这种方法应该没有问题,但是

  • 有必要创建两个
    cmd
    实例来处理管道的每一侧,并对每个源文件执行此操作,这样会减慢处理过程

  • 如果代码在覆盖问题未等待
    N
    字符作为否定答案的区域设置上执行,则可能会失败

首先检查文件是否存在

您可以使用内置的
if exist
构造首先检查目标文件是否存在

if not exist "\\destination\%%~nxf" copy "%%~ff" "\\destination"
其中
%%~nxf
如果正在处理的文件的名称和扩展名

因此,最终的代码可能是

对于%%f in(“D:\path\import\u orders\xml\u files\*.xml”)执行以下操作(
如果不存在“\\destination\%%~nxf”复制“%%~ff”“\\destination”
如果不是错误级别1,请移动“%%~ff”D:\path\import\u orders\xml\u files\archive\”
)

如果!错误等级!equ 0 move…
所以您希望复制而不覆盖?请尝试使用
copy/y copy“%%~ff”“\\destination”
@npocmaka。如果文件已经存在,则应跳过该副本。@darkfang我的代码有什么区别?抱歉,我从来没有用批处理文件来处理更高级的事情。
if!错误等级!equ 0 move…
所以您希望复制而不覆盖?请尝试使用
copy/y copy“%%~ff”“\\destination”
@npocmaka,它应该跳过cop