Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 批处理脚本-交换数组下标值_Arrays_Batch File_Scripting - Fatal编程技术网

Arrays 批处理脚本-交换数组下标值

Arrays 批处理脚本-交换数组下标值,arrays,batch-file,scripting,Arrays,Batch File,Scripting,首先,我想说,批处理脚本编写是我曾经做过的事情,它是为了我班上的作业,所以请耐心听我说。我试图获取一个数组索引,并将其中一个索引替换为另一个索引。如果我在分配索引后回显每个索引,我将获得预期的输出,但是如果我尝试回显数组,则数组没有更改。正如我所说,我对编程特别是批处理非常陌生,所以我确信我缺少一些基本的东西 我的输出 if index[0] is GTR index[4] if I enter 5,4,3,2,1: echo %index[4]% outputs 5 %index[0] out

首先,我想说,批处理脚本编写是我曾经做过的事情,它是为了我班上的作业,所以请耐心听我说。我试图获取一个数组索引,并将其中一个索引替换为另一个索引。如果我在分配索引后回显每个索引,我将获得预期的输出,但是如果我尝试回显数组,则数组没有更改。正如我所说,我对编程特别是批处理非常陌生,所以我确信我缺少一些基本的东西

我的输出

if index[0] is GTR index[4] if I enter 5,4,3,2,1:
echo %index[4]% outputs 5 %index[0] outputs 1
echo %numbers% outputs 5,4,3,2,1
我的代码

@echo off

set /p num1=Enter first num
set /p num2=Enter second num
set /p num3=Enter third num
set /p num4=Enter foruth num
set /p num5=Enter fifth num

SET /a num1=%num1%
SET /a num2=%num2%
SET /a num3=%num3%
SET /a num4=%num4%
SET /a num5=%num5%

SET numbers=%num1% %num2% %num3% %num4% %num5%

(for %%x in (%numbers%) do (echo %%x))

echo my array %numbers%

if %num1% GTR %num5% (
    SET /A temp=%num1%
    SET numbers[0]=%num5%
    SET numbers[4]=%temp%
    echo INDEX 4 is: %numbers[4]% INDEX 1 is: %numbers[0]%
    ) else (
        echo "end of array is greater than start"
)

在上面的评论中,我需要使用
setlocalenabledelayedexpansion
这样做之后,我发现单独分配每个索引更容易,并且我没有测试是否会像我问题中的代码那样工作。ie设置/a值[1]=值[1]

@echo off
setlocal enabledelayedexpansion

SET /p elem[0]=Enter a num
SET /p elem[1]=Enter a num
SET /p elem[2]=Enter a num
SET /p elem[3]=Enter a num
SET /p elem[4]=Enter a num
rem CHANGE TO INTEGER
SET /a elem[0]=elem[0]
SET /a elem[1]=elem[1]
SET /a elem[2]=elem[2]
SET /a elem[3]=elem[3]
SET /a elem[4]=elem[4]
rem loop through each value 0-4, echo each index value
for /l %%n in (0,1,4) do (
    echo !elem[%%n]!
)
rem Check if value of elem[0] greater than elem[4], if so swap their positions
if %elem[0]% GTR %elem[4]% (
    set /a temp = elem[0]
    set /a elem[0] = elem[4]
    set /a elem[4] = temp

    echo Element 0 is greater than element 4 the new array is: 
    for /l %%n in (0,1,4) do (
        echo !elem[%%n]!
    ) 
rem If not greater, no swap needed
) else (echo Element 0 is NOT greater than element 4 the array is still the same)

批处理脚本中没有数组或列表的概念;变量
numbers[1]
只是一个特殊命名的正态变量,如
num1
;这就是为什么我称这些变量为伪数组。因此,
numbers[1]
numbers
没有任何关系……毕竟,我已经想到,如何访问numbers数组并替换所需的内容?希望我不必单独分配每个变量,然后循环它们。那么,您应该看看……您需要延迟扩展来使用
if
语句中定义或更改的变量。在代码开头添加
setlocal enabledelayedexpansion
。在
if
中,您需要更改行
设置数字[4]=!临时工
回声索引4是:!数字[4]!索引1是:!数字[0]旁注--此处发布的代码无法生成已发布的输出。