Arrays 批处理:比较数组

Arrays 批处理:比较数组,arrays,batch-file,binary,Arrays,Batch File,Binary,我试图在批处理脚本中比较两个数组,但恐怕我做错了。 下面的代码从文件中检索前12个字节,并尝试将其与给定格式进行比较 你能帮我做TODO部分吗 PS:我不确定是否正确使用了数组变量 @echo off SETlocal enabledelayedexpansion SET read_byte_cmd=powershell -command Get-Content -encoding Byte -TotalCount 12 "'DB.accdb'" SET ACCESS_BYTES[0]=0

我试图在批处理脚本中比较两个数组,但恐怕我做错了。 下面的代码从文件中检索前12个字节,并尝试将其与给定格式进行比较

你能帮我做TODO部分吗

PS:我不确定是否正确使用了数组变量

@echo off

SETlocal enabledelayedexpansion
SET read_byte_cmd=powershell -command Get-Content -encoding Byte -TotalCount 12 "'DB.accdb'" 

SET ACCESS_BYTES[0]=0
SET ACCESS_BYTES[1]=1
SET ACCESS_BYTES[2]=0
SET ACCESS_BYTES[3]=83
SET ACCESS_BYTES[4]=116
SET ACCESS_BYTES[5]=97
SET ACCESS_BYTES[6]=110 
SET ACCESS_BYTES[7]=100
SET ACCESS_BYTES[8]=97
SET ACCESS_BYTES[9]=114
SET ACCESS_BYTES[10]=100
SET ACCESS_BYTES[11]=32

echo list array --------------------
SET ACCESS_BYTES[
echo\

echo list file bytes --------------
set i=0
for /f "tokens=1 delims==" %%i in ('%read_byte_cmd%') do (
    set /A i+=1
    echo %read_byte_array[!i!]%=%%i
    )
echo\

echo list values only --------------
for /f "tokens=2 delims==" %%i in ('SET ACCESS_BYTES[') do echo %%i
echo\

echo comparison --------------------
:: TODO compare ACCESS_BYTES[i] with read_byte_array[i], if equal success..

我想你在找这样的东西:

@echo off

SETlocal enabledelayedexpansion
SET read_byte_cmd=powershell -command Get-Content -encoding Byte -TotalCount 12 "'DB.accdb'" 

SET "ACCESS_BYTES=[0,1,0,83,116,97,110,100,97,114,100,32]"
set "READ_BYTES=["
for /f "tokens=1 delims==" %%i in ('%read_byte_cmd%') do (
    set "READ_BYTES=!READ_BYTES!%%i,"
)
set "READ_BYTES=%READ_BYTES:~0,-1%]"
echo %ACCESS_BYTES%
echo %READ_BYTES%
echo.
if "%READ_BYTES%"=="%ACCESS_BYTES%" echo same
if not "%READ_BYTES%"=="%ACCESS_BYTES%" echo not the same
pause

这不使用数组,只是比较两个变量。

我想您正在寻找这样的东西:

@echo off

SETlocal enabledelayedexpansion
SET read_byte_cmd=powershell -command Get-Content -encoding Byte -TotalCount 12 "'DB.accdb'" 

SET "ACCESS_BYTES=[0,1,0,83,116,97,110,100,97,114,100,32]"
set "READ_BYTES=["
for /f "tokens=1 delims==" %%i in ('%read_byte_cmd%') do (
    set "READ_BYTES=!READ_BYTES!%%i,"
)
set "READ_BYTES=%READ_BYTES:~0,-1%]"
echo %ACCESS_BYTES%
echo %READ_BYTES%
echo.
if "%READ_BYTES%"=="%ACCESS_BYTES%" echo same
if not "%READ_BYTES%"=="%ACCESS_BYTES%" echo not the same
pause

这不使用数组,只是比较两个变量。

您的批处理脚本正在调用PowerShell,PowerShell是一种功能强大得多的数据处理语言。为什么不在PowerShell中进行比较?
Compare-Object
cmdlet(别名
diff
)可以快速比较两个数组,数组语法为PowerShell,比CMD简单得多

比较-AccessBytes.ps1 从批处理调用

PowerShell.exe -ex bypass -f Compare-AccessBytes.ps1
如果需要将其捕获到批处理变量中,请使用
for/F
语法捕获脚本的输出

for /f %%a in ('PowerShell.exe -ex bypass -f Compare-AccessBytes.ps1') do if "%%a"=="Matching" (echo Yep, it matches.) else (echo Sorry, nope)

最后,如果批处理文件是.ps1的唯一访问群体,那么让PowerShell以其本地方言(退出代码)直接与CMD通信就更容易了

Compare-AccessBytes2.ps1 在批处理中,运行命令并检查
ERRORLEVEL

PowerShell.exe -ex bypass -f Compare-AccessBytes.ps1
if %ERRORLEVEL% EQU 12345 (
   echo "Declare a holiday, the bytes match!"
) else (
   echo "So sad, no match today."
)

批处理脚本正在调用PowerShell,PowerShell是一种功能强大得多的数据处理语言。为什么不在PowerShell中进行比较?
Compare-Object
cmdlet(别名
diff
)可以快速比较两个数组,数组语法为PowerShell,比CMD简单得多

比较-AccessBytes.ps1 从批处理调用

PowerShell.exe -ex bypass -f Compare-AccessBytes.ps1
如果需要将其捕获到批处理变量中,请使用
for/F
语法捕获脚本的输出

for /f %%a in ('PowerShell.exe -ex bypass -f Compare-AccessBytes.ps1') do if "%%a"=="Matching" (echo Yep, it matches.) else (echo Sorry, nope)

最后,如果批处理文件是.ps1的唯一访问群体,那么让PowerShell以其本地方言(退出代码)直接与CMD通信就更容易了

Compare-AccessBytes2.ps1 在批处理中,运行命令并检查
ERRORLEVEL

PowerShell.exe -ex bypass -f Compare-AccessBytes.ps1
if %ERRORLEVEL% EQU 12345 (
   echo "Declare a holiday, the bytes match!"
) else (
   echo "So sad, no match today."
)


您可以定义数组,从
0
开始,但在
for
循环中,您开始使用
1
进行索引(使用
i=0
输入
,然后添加一个,然后
echo…[!i!]
。意图或逻辑怪癖?所有字节都需要相同吗?如果是,您就不能将单个变量与所有字节进行比较吗(如果需要,使用
作为分隔符)看看它们是否相等。@Stephan没有怪癖,只是多次尝试修复代码的结果…@Dennis所有字节都必须是相同的,但除此之外,对于如何操作没有限制。数组与数组只是我的第一种方法。您定义数组时从
0
开始,但在
for
循环中开始定义用
1
索引(用
i=0
输入
,添加一个,然后
echo…[!i!]
。意图或逻辑怪癖?是否所有字节都需要相同?如果是,您不能将单个变量与所有字节进行比较(如果需要,使用
作为分隔符)看看它们是否相等。@Stephan没有怪癖,只是多次尝试修复代码的结果…@Dennis所有字节都必须相同,但除此之外,应该如何操作也没有限制。数组与数组只是我的第一种方法。Dennis,谢谢你。但我仍在使用它。你的代码在元素[1]处停止,打印消息“byte 1,value 1不等于”,此时它应该循环遍历所有元素(因为它们相等)。代码似乎没有遍历数组访问字节(始终保持为0)…@lbrunolx错误,你能告诉我它现在是否给出了更好的消息吗?我还使循环从0开始,而不是从1开始。它在错误消息出现之前打印成功了吗?丹尼斯,恐怕它仍然在[1]停止。我得到:read\u byte\u array[0]=0正确的read\u byte\u array[1]=1字节1,值1不等于0并非所有字节都是same@lbrunolx看来我把延迟的扩展搞砸了,我会尽快解决的minute@lbrunolx是的,最后一个问题是变量
i
包含一个数字,这导致它有时会被解释(当使用转义
%%
aproach时)作为%1,它开始查看批处理文件的参数。但是,这种方法没有这个问题Dennis,非常感谢。但我仍然在使用它。您的代码在元素[1]处停止,打印消息“byte 1,value 1不等于”,此时它应该在所有元素之间循环(因为它们相等)。代码似乎没有遍历数组访问字节(始终保持在0)。@lbrunolx我的错误,您能告诉我它现在是否提供了更好的消息吗?我还使循环从0开始,而不是从1开始。它在错误消息之前打印成功了吗?丹尼斯,恐怕它仍然在[1]停止。我得到:read\u byte\u array[0]=0正确的读取字节数组[1]=1字节1,值1不等于0并非所有字节都是same@lbrunolx看来我把延迟的扩展搞砸了,我会尽快解决的minute@lbrunolx是的,最后一个问题是变量
i
包含一个数字,这导致它有时会被解释(使用转义的
%%
aproach时)作为%1,开始查看批处理文件的参数。但是,这种方法没有这个问题谢谢你,Ryan。非常感谢:)谢谢你,Ryan。非常感谢:)