3

在作为输出的一部分的以下脚本中,我得到:=-2147483648+312704 Invalid Number。数字被限制为 32 位精度。

这显然在带符号的 32 位数字的范围内(我也尝试过 2147483648+312704 认为只支持无符号 32),但得到了同样的错误。

奇怪的是,这个脚本在 WindowsXP 上运行良好,但是当我在 Windows7 上尝试时,我得到了上述错误。

为什么不批量执行此操作?

为方便起见,代码如下...

setlocal EnableDelayedExpansion

@set TEMPDIR="%CD%\temp739123834543"
@set ADDR=-2147483648
@set HEXADDR=
@set /a ZIPSLEEP_MS=0

@del frontScreenImages.c
@del frontScreen.zip
@mkdir %TEMPDIR%

for %%f in (*.png) do (

    echo %%~nf
    @call toHex ADDR HEXADDR
    echo "ADDR:!HEXADDR!"
    convertFrontScreenPng.exe %%~nf.png frontScreenImages.c transpose append "0x!HEXADDR!" "__xdata_rom" "#pragma required="
rem    set BINFILE=%TEMPDIR%\a!HEXADDR!_%%~nf.bin
    set BINFILE=%TEMPDIR%\a80000000_frontScreenImages.bin
    echo "BIN:!BINFILE!"
    convertFrontScreenPng.exe %%~nf.png !BINFILE! transpose append
    for %%A in (!BINFILE!) do set /a ADDR=%ADDR%+%%~zA
    set /a ZIPSLEEP_MS=!ZIPSLEEP_MS! + 500
)

@echo Set objArgs = WScript.Arguments > _zipIt.vbs
@echo InputFolder = objArgs(0) >> _zipIt.vbs
@echo ZipFile = objArgs(1) >> _zipIt.vbs
@echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
@echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
@echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
@echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
@echo wScript.Sleep !ZIPSLEEP_MS! >> _zipIt.vbs

@CScript  _zipIt.vbs  %TEMPDIR%  "%CD%\frontScreen.zip"

@del   _zipIt.vbs
@rmdir %TEMPDIR% /s /q
sleep 3
4

1 回答 1

2

我用一些额外的信息重复David RuhmannEndoro的答案。

在CMD.EXE 如何解析数字的规则中解释了为什么-2147483648在 Windows Vista、Windows 7 和 Windows 8 上解析数字时value会导致无效数字错误消息,而在 Windows XP 上没有问题。字符串到有符号/无符号整数转换的代码在源代码中编写得很差,cmd.exe因此不适用于最小有符号 32 位整数。

此批处理文件的一种解决方案是使用

set /a ADDR+=%%~zA

代替

set /a ADDR=%ADDR%+%%~zA

因为这会导致命令行

set /a ADDR+=312704

代替

set /a ADDR=-2147483648+312704

但这不是唯一的解决方案

@echo off
set VALUE1=-2147483648
set VALUE2=312704
set /a RESULT=%VALUE1%+%VALUE2%
echo Result of %VALUE1% + %VALUE2% is %RESULT%

导致在 Windows 7 和 Vista 上执行时出现错误消息。

另一个解决方案是大多数limits.hC/C++ 包含的INT_MIN预处理器宏,以避免在编码不佳的预处理器上出现同样的问题:将最小有符号 32 位整数定义为表达式而不是固定值。

#define INT_MIN  (-2147483647-1)
#define LONG_MIN (-2147483647L-1L)

此解决方法从上面应用于小批量文件:

@echo off
set VALUE1=(-2147483647-1)
set VALUE2=312704
set /a RESULT=%VALUE1%+%VALUE2%
echo Result of %VALUE1% + %VALUE2% is %RESULT%

现在即使在 Windows 7 和 Vista 上执行批处理文件也没有问题。

于 2014-07-05T13:25:26.507 回答