批处理循环错误 - 仅复制1个文件

时间:2014-09-09 23:33:35

标签: windows shell batch-file scripting

我正在尝试运行一个bat文件:

  1. 创建一个文件夹
  2. 搜索.log分机号
  3. 的所有文件
  4. 将文件复制并重命名为MyFile_customString.log到另一个文件夹
  5. 到目前为止,我做到了这一点:

    @echo off
    
    set host_name=%1
    set origin_path=%2
    set destiny_path=%3
    set destiny_host_path=%destiny_path%\%host_name%\
    mkdir .\%destiny_host_path%
    
    FOR %%G IN (%origin_path%/*.log) DO (
        SET _fileName=%%G
        SET _custom=%_fileName:.log=_%%host_name%.log%
        xcopy /Y /F %origin_path%\%_fileName% %destiny_host_path%\%_custom%
    )
    

    将MyTest.log和MyTest2.log文件放在origin_path仅MyTest2.log文件中复制到destiny_host_path

    我错过了什么?

2 个答案:

答案 0 :(得分:4)

SetLocal EnableDelayedExpansion

之后,您需要在批处理文件的顶部@echo

在您的代码中:

FOR %%G IN (%origin_path%/*.log) DO (
    SET _fileName=%%G
    SET _custom=%_fileName:.log=_%%host_name%.log%
    xcopy /Y /F %origin_path%\%_fileName% %destiny_host_path%\%_custom%
)

应该是:

FOR %%G IN (%origin_path%/*.log) DO (
    SET "_fileName=%%G"
    FOR %%H in (!host_name!) Do (
        SET "_custom=!_fileName:.log=_%%H.log!"
    )
    xcopy /Y /F !origin_path!\!_fileName! !destiny_host_path!\!_custom!
)

答案 1 :(得分:0)

FOR %%G IN (%origin_path%\*.log) DO (
 xcopy /Y /F "%origin_path%\%%G" "%destiny_host_path%\%%~nG_%host_name%.log"
)

(未测试的)

在这种情况下无需delayedexpansion

请参阅提示中的for /? |more,了解有关使用~ - 修饰符来提取部分文件名的信息。

在您的原始文件中,%行中的%不平衡(假设set _custom在该上下文中是正确的)。

提示:暂时将xcopy替换为echo xcopy 显示,而不是执行命令 - 如果出现错误,则更容易调试。