如何使用批处理文件在文件夹之间随机移动文件?

时间:2011-02-14 20:15:48

标签: batch-file

这是我想要做的 - 我有一个目录A. A包含2个文件夹跟踪和activeOnlytraces。我想用4个文件夹创建另一个目录(比方说B) - trace,teststraces,activeOnlytraces和testingactiveOnlytraces。我首先将A \ traces和A \ activeOnlytraces复制到B \ traces和B \ activeOnlytraces。然后我从B \ trace和B \ activeOnlytraces到B \ testingtraces和B \ testingactiveOnlytraces随机移动一些文件(所有文件都是“Tracenn.xml”形式)。我想创建用户想要的目录B。我为此写了一个.bat文件。这是我的代码

rem %1 timer
rem %2 training name
rem %3 max training set
rem %4 testing count

set /a "x = 1"

:while1

    if %x% leq %3 (

        set /a "y = 1"
        set /a "count = 0"

        md ..\%2_%x% 
        md ..\%2_%x%\traces
        del /q ..\%2_%x%\traces\*.* 

        md ..\%2_%x%\activeOnlytraces
        del /q ..\%2_%x%\activeOnlytraces\*.* 

        md ..\%2_%x%\testingtraces
        del /q ..\%2_%x%\testingtraces\*.* 

        md ..\%2_%x%\testingactiveOnlytraces
        del /q ..\%2_%x%\testingactiveOnlytraces\*.* 

        move .\trace\*.* ..\%2_%x%\traces\*.* 
        move .\activeOnlytraces\*.* ..\%2_%x%\activeOnlytraces

        for /F %%i in ('dir traces /b') do (
        set /a "count = count + 1")        

        :while2

            if %y% leq %4 (
               :beg
               set rnd %random%
               if %rnd% GTR %count% goto beg

               if not exist ".\traces\Trace%rnd%.xml" (
               goto beg 
               )

               move ..\%2_%x%\traces\Trace%rnd%.xml ..\%2_%x%\testingtraces\.
               del /q ..\%2_%x%\traces\Trace%rnd%.xml

               move ..\%2_%x%\activeOnlytraces\Trace%rnd%.xml ..\%2_%x%\testingactiveOnlytraces\.
               del /q ..\%2_%x%\activeOnlytraces\Trace%rnd%.xml

               set /a "y = y + 1"
               goto :while2

            )        


        set /a "x = x + 1"

        goto :while1
    )

我收到以下错误 -

D:\A>set /a "x = 1"
The syntax of the command is incorrect.

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您对错误消息感到困惑,因为@indiv。 set /a "x = 1"没有错误;这很好。由于您没有关闭脚本的回显,它会在识别它时回显每个命令。它正确识别并执行set命令。但是,它无法解析并识别随后的命令。由于没有得到承认,因此没有得到回应。所以错误发生在你没看到的以下命令上!

以下命令是if命令;不幸的是,因为你使用了一个带括号的块,命令处理器无益地告诉批处理文件的其余部分是错误的。你可以通过使用“binary-chop”调试方法来解决这个问题。只需删除一半代码,直到错误消失。然后,它会告诉您哪段代码包含语法错误。重复,直到找到所有错误。我是为你做的。

设置rnd变量时出现语法错误:set rnd %random%中应包含=。  您还需要使用延迟扩展,因为扩展在创建和分配变量之前发生,后面的%rnd%将扩展为空白。我也解决了这个问题。你得到的结果是:

rem %1 timer
rem %2 training name
rem %3 max training set
rem %4 testing count
setlocal delayedexpansion
set /a "x = 1"

:while1

    if %x% leq %3 (

        set /a "y = 1"
        set /a "count = 0"

        md ..\%2_%x% 
        md ..\%2_%x%\traces
        del /q ..\%2_%x%\traces\*.* 

        md ..\%2_%x%\activeOnlytraces
        del /q ..\%2_%x%\activeOnlytraces\*.* 

        md ..\%2_%x%\testingtraces
        del /q ..\%2_%x%\testingtraces\*.* 

        md ..\%2_%x%\testingactiveOnlytraces
        del /q ..\%2_%x%\testingactiveOnlytraces\*.* 

        move .\trace\*.* ..\%2_%x%\traces\*.* 
        move .\activeOnlytraces\*.* ..\%2_%x%\activeOnlytraces

        for /F %%i in ('dir traces /b') do (
            set /a "count = count + 1" 
            )        

         :while2

            if %y% leq %4 (
               :beg
               set rnd=%random%
               if !rnd! GTR %count% goto beg

               if not exist ".\traces\Trace%rnd%.xml" (
               goto beg 
               )

               move ..\%2_%x%\traces\Trace%rnd%.xml ..\%2_%x%\testingtraces\.
               del /q ..\%2_%x%\traces\Trace%rnd%.xml

               move ..\%2_%x%\activeOnlytraces\Trace%rnd%.xml ..\%2_%x%\testingactiveOnlytraces\.
               del /q ..\%2_%x%\activeOnlytraces\Trace%rnd%.xml

               set /a "y = y + 1"
               goto :while2

            )


        set /a "x = x + 1"

        goto :while1
)

现在你可以做到这一点。学习更强大的调试技术 - 即破解它直到它工作 - 不要只是在第一次错误时抛弃,否则你将永远不会学到任何东西。 (我将此作为其他读者的提示添加)