Как перемещать файлы случайным образом между папками, используя пакетный файл? - PullRequest
0 голосов
/ 14 февраля 2011

Вот то, что я пытаюсь сделать - у меня есть каталог A A, содержащий 2 следа папок и activeOnlytraces.Я хочу создать еще один каталог (скажем, B) с 4 папками - трассировки, тест-трассировки, activeOnlytraces и testingactiveOnlytraces.Сначала я копирую A \ traces и A \ activeOnlytraces в B \ traces и B \ activeOnlytraces.Затем я случайным образом перемещаю некоторые файлы (все файлы имеют форму "Tracenn.xml") из B \ traces и B \ activeOnlytraces в B \ testingtraces и B \ testingactiveOnlytraces.Я хочу создать столько каталогов 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 голосов
/ 27 декабря 2014

Вас смущает сообщение об ошибке, как @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
)

Теперь вы могли бы это сделать.Изучите более мощные методы отладки - то есть взламывайте их до тех пор, пока они не сработают - не просто бросайте полотенце при первой ошибке, иначе вы никогда ничего не узнаете.(Я добавил это как подсказку другим читателям)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...