哦,10K、20K 和 100K 会想将其称为重复。但事实并非如此。
原因仅仅是:
使用数组变量“arr”使用计数变量“x”或任何
比较数组索引:
arr[0] == arr[1] 吗?(但使用动态计数变量)
您不能使用 -- For /L (0,1, length) 来执行此操作,因为设置 x+=1 以及变量 !arr! 不能,或者我不知道如何,同时作为两个变量工作。
我尝试过使用 %x% 和 !x! 和 setlocal,而不是使用 setlocal...
我似乎无法获得正确的变量语法组合。
例如
!arr[%x%]!
!arr[!x!]!
%%arr[%x%]%%
等等。
换句话说: arr[x] == arr[x+1] ? 在循环比较中
Set "inName=%~1"
Set arrCount=0
Set count=0
Set arr = []
:: Do some work
:: Some code delted for clarity of problem at hand
:: populate the arr (array)
:loop
call set "char=%%inName:~%count%,1%%"
If defined char (
echo %count%[%char%]
Set arr[%count%]=%char%
Set /a arrCount+=1
Set /a count+=1
Set trimName=%trimName%%char%
goto :loop
)
Set x=0
setlocal enableDelayedExpansion
REM fails of tried variable variations
:: echo array is %arrCount% in length
:: call echo X is %x% at %%arr[%x%]%%
:: call echo letter: %%arr[%x%]%%
:: define: !arr[%x%]! !arr[!!x!!]! !!arr[!x!]!! and other variations
:SymLoop
if defined !arr[%x%]! (
echo X---: !arr[%x%]!
CALL :increment RESULT x
GOTO :SymLoop
)
:: Different methods of resetting x to zero. Both fail
set /a x=0
CALL :reset_one RESULT x
:: For loop, using counter
for /L %%F in (0,1,%arrCount%) do (
echo !arr[%%F]! and !arr[%x%]! vs !arr[!%x%!]! -- x is !x!
call Set /A x+=1
REM CALL :increment RESULT x
)
endlocal
EXIT
:increment
SET /A countArray+=1 SET /A x+=1
:reset_one SET /A x=0
该批处理文件的输入是:某个名称
我尝试过的循环如你所见:
我尝试过执行模拟循环,通过转到:符号循环
另外,尝试通过以下方式读取、回显、数组如果定义了 !arr[%x%]!
结果:我可以让 x 增加,但是“arr”和“x”的组合不行
s and s vs 0 -- x is 0
o and s vs 0 -- x is 1
m and s vs 0 -- x is 2
e and s vs 0 -- x is 3
_ and s vs 0 -- x is 4
_ and s vs 0 -- x is 5
n and s vs 0 -- x is 6
a and s vs 0 -- x is 7
m and s vs 0 -- x is 8
e and s vs 0 -- x is 9
and s vs 0 -- x is 10
输入:“some__name”,将与将“some_name”传递到批处理文件 mybatch.bat >C:....>mybatch some__name 进行比较
基本上我填充了数组 [s][o][m]...
我想问:索引 0 是否匹配索引 1?
稍后我会问,char 的索引 n 是否为““以及 char 的索引 n+1”“?
编辑:我碰到了一个声明、评论,并找到了这个。我不是 Windows 工程师。我使用程序员的技能来创建批处理文件。所以我不完全理解我的逻辑的深层问题。从我在网上读到的内容来看,“call echo”是一层扩展?所以它就像“setlocal enabledelaytedexpansion...”一样工作?不知何故,第二行“call echo”起作用了,这让我相信 arr 确实被定义了。
Set x=0
::fails
echo Array: arr[0] is %%arr[%x%]%%
::works
Call echo Array: arr[0] is %%arr[%x%]%%
编辑修复
来自评论建议:
if defined arr[%x%] ( 可以工作。阅读 if /?: 正确的语法是 IF DEFINED variable 命令(这里变量应该是一个变量名而不是扩展的!variable!)
至于其余代码,正是上述注释引导我完成了批处理文件。我能够修复 :SymLoop 并正确读取数组。
部分代码:
:SymLoop
Call Set "ArrVar=%%arr[%x%]%%"
If defined ArrVar (
Call echo X---: !arr[%x%]!
Set /A x+=1
GOTO :SymLoop
)
答案1
* 更新 *
确定数组中元素数量的函数:
Call :getsize ArrayName
:getsize
set _R=0
:countsize
IF NOT DEFINED %1[!_R!] (
Set Max=!_R!
ECHO Array contains !Max! Elements.
GOTO :EOF
) else (
Set /a _R+=1
GOTO countsize
)
* 更新:粘贴链接演示数组元素的移位和替换 *
* 编辑 * 为了更好地涵盖偏移比较,您的问题包括:
REM - Function to be called.
:precomp
Set Check=0
Set /a Offset=!Check!-1
:comp
IF !X_Array[%Check%]!==!X_Array[%Offset%]! DO (
Commands
) else (
Commands
)
REM Increase in values placed after checks to allow for Array index 0
IF !check!==!ArraySize! GOTO :EOF
Set /a Check+=1
Set /a Offset+=1
Goto comp
定义和访问数组的要点:批量
-您用来定义数组索引的变量不能用于重新调用它。因此 !Array[%x%]! 只会返回设置为 x 的最后一个值。
-一般不建议使用单个字母或数字变量。
-For 循环可用于将值设置为索引,以及检索/比较数组。-For 循环不适合移动数组索引的值。请使用函数循环来实现这一点。
-数组元素本身不需要使用计数值,可以使用变量来代替。
定义具有变化的值的数组并进行比较的示例。
@REM this script is only to demonstrate the mechanics of Comparing Arrays and Shifting Arrays.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
Set Max=5
Set /p "Max=[Enter Array Range:]
REM - Account for Element 0:
Set /a Max-=1
:main
Set "Val=0"
cls
REM - Use for /L loop to assign values to array elements using Max as the total number of elements.
For /L %%a in (0,1,!Max!) DO (
Set /p "Array[!Val!]=[Enter Array[!Val!] Value:]"
If not defined Array[!Val!] (
goto main
)
Set /a Val+=1
)
REM - Call function to display values assigned to array elements
CALL :Display
pause
REM - Tacks ann Element onto the end of the Array
REM - User inputs the New Elements Value.
REM - For Loop creats an Array for comparison
REM - The example Clones the Original Array and shifts the the Elements using a tmp offset Variable - !Val_O!
REM - CALLING and setting in function is vital to getting the value to set.
:append
Set /a Max+=1
cls
Set cvo=0
For /L %%a in (0,1,!Max!) DO (
Set cva=%%a
Call :Increment
IF NOT DEFINED Array[!cvo!] (
Set /p comp[%%a]=[Enter comp[%%a] Value:]
)
IF !comp[%%a]!==!comp[%Max%]! (
Set /p Array[!Max!]=[Enter Array[!Max!] Value:]
Goto Comparison
)
)
REM - For /L loop displays the values Assigned to each Element in the Comparison Array
:Comparison
CALL :Display
For /L %%a in (0,1,!Max!) DO (
ECHO comp[%%a] = !comp[%%a]!
)
pause
cls
REM - For /L Loop Compares the Array and Substitutes Values If Arrays don't Match.
REM - Action taken is for Demonstration Purposes.
REM - the Action Demonstrated executes shifting the values of the Arrays Elements using the Clone/Offset Array.
:process
For /L %%a in (0,1,!Max!) DO (
IF NOT !Array[%%a]!==!Comp[%%a]! (
ECHO Array[%%a] !Array[%%a]! NEQ !Comp[%%a]! Comp[%%a]
ECHO Values Exchanged for Array[%%a]
Set "Array[%%a]=!comp[%%a]!"
) else (
ECHO Values Matched for Array[%%a]
)
)
pause
CALL :Display
:end
Pause
EXIT
:Increment
Set /a cvo+=1
Set comp[%cva%]=!Array[%cvo%]!
GOTO :EOF
GOTO :EOF
REM - Function that uses For /L loop to display the values of all currently assigned Elements.
:Display
cls
For /L %%a in (0,1,!Max!) DO (
ECHO array[%%a] = !array[%%a]!
)
GOTO :EOF
* 关于您的问题 !Array[%X%]!==!Array[%X%+1]! *
它永远不会被比较为相等。您需要与第二个数组/值进行比较。
如果你的目标是增加或* 转移值 *存储在数组元素中向下/向上一个,请参阅我在答案顶部粘贴的代码链接。它应该包含足够的示例来帮助您入门。