所以我决定批量生成适合某个 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/