这是我想要做的 - 我有一个目录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.
我做错了什么?
答案 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
)
现在你可以做到这一点。学习更强大的调试技术 - 即破解它直到它工作 - 不要只是在第一次错误时抛弃,否则你将永远不会学到任何东西。 (我将此作为其他读者的提示添加)