batch-file - 多次迭代 sum 后出现负数

标签 batch-file cmd

所以我决定批量生成适合某个 DVD 的可能的电影列表。
问题是它有时会返回负数作为文件的大小

@set @x=0 /*
@echo off
@set _thisbatchscript="%~f0"
@setlocal enabledelayedexpansion
@set max=8525510083
@set "parentfolder=%__CD__%"

@set flenght=1
@for /r . %%g in (*.*) do (
@call :gera "%%g"
@set "var=%%g"
@set var=!var:%parentfolder%=!
@set fname[!flenght!]=!var!
@set /a flenght=!flenght!+1
)
@set /a flenght=!flenght!-1

@set movielgt=1
@for /l %%a in (1,1,!flenght!) do (
if !fext[%%a]!==.avi (
@set movienm[!movielgt!]=!fname[%%a]!
@set moviesz[!movielgt!]=!fsize[%%a]!
@set ftemp=!fname[%%a]!
@set ftemp=!ftemp:.avi=!
@set movienoext[!movielgt!]=!ftemp!
@set /a movielgt=!movielgt!+1
)
)
@set /a movielgt=!movielgt!-1

@set subtitlelgt=1
@for /l %%a in (1,1,!flenght!) do (
@if !fext[%%a]!==.srt (
@set subtitlenm[!subtitlelgt!]=!fname[%%a]!
@set subtitlesz[!subtitlelgt!]=!fsize[%%a]!
@set ftemp=!fname[%%a]!
@set ftemp=!ftemp:.srt=!
@set subtitlenoext[!subtitlelgt!]=!ftemp!
@set /a subtitlelgt=!subtitlelgt!+1
)
)
@set /a subtitlelgt=!subtitlelgt!-1

@for /l %%a in (1,1,!movielgt!) do (
@for /l %%b in (1,1,!subtitlelgt!) do (
@if !movienoext[%%a]!==!subtitlenoext[%%b]! (
@set /a moviesz[%%a]=!moviesz[%%a]!+!subtitlesz[%%b]!
)
)
)

set resultlgt=0
for /l %%a in (1,1,!movielgt!) do (
if !moviesz[%%a]! LEQ %max% (
set _tempresultsz=0
set _tempresultnm=
set tamanho=
for /l %%b in (%%a,1,!movielgt!) do (
set /a tamanho+=!moviesz[%%b]!
if !tamanho! LEQ %max% (
set /a _tempresultsz+=!moviesz[%%b]!
set _tempresultnm=!_tempresultnm! !movienm[%%b]!
call :resultpush  "!_tempresultnm!" !_tempresultsz!
)
)
)
)


echo tamanho;arquivos
for /l %%a in (1,1,!resultlgt!) do (
echo !result[%%a]sz!;!result[%%a]nm!
) 


:gera
@set fsize[!flenght!]=%~z1
@set fext[!flenght!]=%~x1
@goto :EOF

:resultpush
@set /a resultlgt+=1
for /f "tokens=* delims= " %%a in ("%~1") do set str=%%a
@set result[!resultlgt!]nm=%str%
REM for /f "delims=" %%i in ('cscript //Nologo //E:jscript %_thisbatchscript% %2') do set _tamanho=%%i
@set result[!resultlgt!]sz=%2
@goto :EOF
REM start of javascript (not in use(too slow to run on evey interation)) 
goto:EOF */
var Size=WScript.Arguments(0);
var result=Size+" Bytes"
if(Size>=1024){
    result=(Size/1024)+" KB";
}
if(Size>=1048576){
    result=(Size/1048576)+" MB";
}
if(Size>=1073741824){
    result=(Size/1073741824)+" GB";
}
if(Size>=1099511627776){
    result=(Size/1099511627776)+" TB";
}
WSH.echo(result);

所以是的,这就是代码 基本上,它从调用的路径获取文件夹和子文件夹中文件的完整列表,然后迭代查找 .avi 和 .srt 文件,将 .avi 文件的大小与 .str 的大小相加。具有相同文件夹路径和文件名的文件,最后再次迭代计算可能适合 DVD 的文件列表

最佳答案

是的,正如 SomethingDark 所建议的那样,您正在挑战 32 位整数的限制。您的 JScript 混合代码可以处理更大的值,高达 2 TB(64 位)。

如果稍微更改一下混合格式,您就可以拥有多个 JScript 作业(如果您愿意,甚至可以拥有 mix JScript and VBScript)。这是一个演示:

<!-- : batch portion
@echo off & setlocal

call :add 2147483647 1234567890 res
call :suffix %res% human
echo %res%, %human%
goto :EOF

:add <int1> <int2> <returnvar>
for /f %%I in ('cscript //nologo "%~f0?.wsf" "%~1" "%~2" //job:add') do set "%~3=%%I"
goto :EOF

:suffix <int> <returnvar>
for /f %%I in ('cscript //nologo "%~f0?.wsf" "%~1" //job:suffix') do set "%~2=%%I"
goto :EOF

: end batch / begin JScript -->
<package>
    <job id="add">
        <script language="JScript">
            WSH.Echo((WSH.Arguments(0) * 1) + (WSH.Arguments(1) * 1));
        </script>
    </job>
    <job id="suffix">
        <script language="JScript">
            var size = WSH.Arguments(0) * 1,
                idx = 0;
            while (size > 1024 && ++idx) size /= 1024;
            WSH.Echo(size.toFixed(1) + ['B','KB','MB','GB','TB'][idx]);
        </script>
    </job>
</package>

顺便说一句,您的脚本中还有一些其他方面可以改进。首先,并非批处理脚本中的所有内容都必须左对齐。这也可以工作:

for /f %%I in (
    'cscript //nologo "%~f0?.wsf" "%~1" "%~2" //job:add'
) do (
    set "%~3=%%I"
)

其次,由于您在脚本顶部使用了 @echo off,因此您不必在每个命令前添加 @ 符号。这就是 @echo off 的意义所在。

最后,使用 set/A 时,您不必使用周围的百分比或感叹号来引用方程中的值。因此,以下三个命令执行完全相同的操作:

set /a flenght=!flenght! + 1
set /a flenght=flenght + 1
set /a flenght+=1

关于batch-file - 多次迭代 sum 后出现负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060675/

相关文章:

string - 如何在不丢失空格的情况下拆分变量中的字符串?

windows - 根据部分文件名批量创建文件夹并将文件移动到该文件夹​​中

batch-file - 如何在FOR命令中指定/D?

ruby - 使用 Ruby 执行命令行时如何转义竖线?

windows - Windows 上 readlink 的 native 替代方案

docker - 重启停止的容器并再次执行CMD

batch-file - 在 setlocals 批处理之间保留变量中的感叹号

windows - 我不遵循此脚本中发生的数学运算

windows-7 - 通过Windows中的命令行工具合并两个png?

batch-file - CMD 自动运行挂起