2011-02-14 54 views
0

這是我正在嘗試做的 - 我有一個目錄A A包含2個文件夾跟蹤和activeOnlytraces。我想用4個文件夾創建另一個目錄(比如說B) - 跟蹤,測試跟蹤,activeOnlytraces和testingactiveOnlytraces。我首先將A \ traces和A \ activeOnlytraces複製到B \ traces和B \ activeOnlytraces。然後我從B \ traces和B \ activeOnlytraces中隨機移動一些文件(所有文件的格式爲「Tracenn.xml」)到B \ teststraces和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. 

我在做什麼錯?

+0

哪個版本的Windows? `set/a「x = 1」`可以在我的XP副本上正常工作。 – indiv 2011-02-14 22:24:22

回答

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 
) 

現在你可以做到這一點。瞭解更強大的調試技術 - 即破解它,直到它的工作 - 不要只是在第一個錯誤拋出毛巾,否則你永遠不會學到任何東西。 (我將此作爲提示添加到其他讀者)

相關問題