Arrays 批处理:比较数组
我试图在批处理脚本中比较两个数组,但恐怕我做错了。 下面的代码从文件中检索前12个字节,并尝试将其与给定格式进行比较 你能帮我做TODO部分吗 PS:我不确定是否正确使用了数组变量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
@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。非常感谢:)