2017-03-02 69 views
0

我对批处理相当新,我一直在尝试编写一些简单的排序程序。这个程序使用最基本的分类系统,并且代码(从我所能看到的)看起来没有错误。然而,当我运行它时,会生成一个随机列表,看起来好像有些排序正在进行,然后数组填充字母“m”。我不明白为什么会发生这种情况,所以如果有人能指出我正确的方向,我将不胜感激。为什么数组填满“m”

我的代码:

@echo off 
color b 
title sorting 
set ar=0 
set num=0 
set check=0 
set checknum=0 
set totalnumber=500 
set randmax=5000 
:array 
if %num% LSS %totalnumber% (
set /A a[%num%]=%random% %% %randmax% 
set /A num=%num%+1 
goto array 
) 
if %num% EQU %totalnumber% (
goto echo1 
) 
:echo1 
for /F "tokens=2 delims==" %%s in ('set a[') do echo %%s 
echo sort initialized 
goto sort 
) 
:sort 
set n=0 
:sortloop 
set /A m=%n%+1 
if %n% EQU %totalnumber% (
goto check 
) 
if %a[%n%]% GTR %a[%m%]% (
set hold=%a[%m%]% 
set a[%m%]=%a[%n%]% 
set a[%n%]=%hold% 
set /A n=%n%+1 
goto sortloop 
) 
if %a[%n%]% LSS %a[%m%]% (
echo a[%n%] check 
set /A n=%n%+1 
goto sortloop 
) 
:check 
set check=0 
set checknum=0 
:checkloop 
set /A checknumplus=%checknum%+1 
if %check% EQU %totalnumber% (
goto complete 
) 
if %checknum% EQU %totalnumber% (
set n=0 
goto sort 
) 
if %a[%checknum%]% LSS %a[%checknumplus%]% (
set /A check=%check%+1 
set /A checknum=%checknum%+1 
goto checkloop 
) 
:complete 
for /F "tokens=2 delims==" %%s in ('set a[') do echo %%s 
for /F "tokens=2 delims==" %%s in ('set a[') do echo %%s > sortedlist.txt 
+0

请阅读/ google关于延迟扩展并重写大量批次。 – LotPings

+0

@LotPings - 没有太多需要改变,真的(虽然它确实需要正确缩进)。 – SomethingDark

回答

3

当你需要在批量使用变量的变量内(通常使用数组时),你需要使用延迟扩展。

现在,您的代码显示为set hold=%a[%m%]%。解释器将此值作为变量%a[%(不存在,所以不使用),字面字符m和变量%]%(也不存在,因此为空)处理。

要解决此问题,请将setlocal enabledelayedexpansion置于代码顶部,然后将您的set语句更改为set hold=!a[%m%]!(并对使用它的其他行执行相同的操作)。