강좌 / 팁

소프트웨어 배치파일로 2GB 이상 계산과 batch hybrid

2023.03.05 22:29

지후빠 조회:1404 추천:13

안녕하세요?

질문 글에서 모자님 링크 보고 아이디어가 떠올라서 만든 내용과 배치 하이브리드에 대한 정보입니다.

모자님 감사합니다.^^

 

정확도는 조금 떨어질 수 있지만 마지막에 순수 batch 파일로만 계산되도록 만들어 봤습니다.

- 숫자 크기에 따라서 Bytes, KB, MB, GB, TB 로 계산되어 보여줍니다.

 

cmd.exe의 set /a 내부명령어로 계산할 수 있는 수는 정수 32(+-31)비트까지 입니다.

2GB 넘어가면 내부명령어로는 정확한 계산을 할 수 없습니다.

이런 경우에 외부 기능(명령어)을 이용한 계산이 필요합니다. 외부 cmd용 유틸, WScript(VBS/JS), Powershell 등 이용

 

참고로, 폴더 용량을 계산하는 방법은 질문 게시판의 글에 명시된 du64.exe을 이용하면 좀 더 빠릅니다.

다만 폴더내 파일 갯수가 너무 많지 않은 경우에는 dir /s/a "폴더" 명령어로 대신할 수도 있습니다.

 

질문에서 처럼, PE에서 사용시 다이어트된 정도에 따라서 외부 기능 선택에 제한이 있어 가능한 조합을 고려해야 합니다.

 

 

1. 외부 유틸로 계산하여 결과 캡쳐 예제 (테스트는 cmd 콘솔에서 실행)

 

1) CCalc.exe ; cmd용 유틸

https://www.softspecialists.com/user/atad/download/smallutilities/CCalc.zip

for /f "tokens=1 delims==" %a in ('"ccalc round(42147483647/1024/1024/1024,2)"') do echo %a

 

2) Powershell 이용

- for /f %a in ('"powershell (42147483647/1024/1024/1024).tostring('#,##0.00')"') do echo %a

- doc_size_w_ps1.cmd

 

3) vbs, js 이용 ; 4번에 vbs 예제 추가로 있습니다.

eval.js eval.vbs

- for /f %a in ('cscript //nologo eval.vbs "42147483647/1024/1024/1024"') do echo %a

- vbs file 내용

WScript.Echo Round(Eval(WScript.Arguments(0)),2)

- for /f %a in ('cscript //nologo eval.js "42147483647/1024/1024/1024"') do echo %a

- js file 내용

WScript.Echo(eval(WScript.Arguments(0)).toFixed(2));

 

 

2. batch 파일에서 vbs 파일 내보내서 실행

eval-vbs-export.bat

 

@echo off

call :CalcVBS "42147483647/1024/1024/1024" res

echo %res% GB

pause & exit /b

:CalcVBS

setlocal enabledelayedexpansion

(for /f "usebackq tokens=*" %%$ in ("%~f0") do (set $=%%$& if "!$:~0,5!"=="::VBS" echo !$:~6!)) >"%temp%\$.vbs"

::VBS WScript.Echo Round(Eval(WScript.Arguments(0)),2)

for /f %%$ in ('cscript "%temp%\$.vbs" //nologo "%~1"') do set $=%%$

del "%temp%\$.vbs" & endlocal & set "%~2=%$%" & exit /b

 

 

3. batch + js,vbs 하이브리드 파일 형태 ; 구글에서 batch hybrid로 검색하면 정보가 많습니다.

 

1) js ; block comment 이용

dir_size_xB+js-hybrid.cmd

 

@if (@X) == (@Y) @end /*

@echo off

set folder=%USERPROFILE%\Documents

for /f "tokens=2,3" %%a in ('dir /s/a "%folder%"') do if %%a==파일 set siz=%%b

for /f "tokens=*" %%# in ('cscript //E:JScript //Nologo "%~f0" "%siz%"') do set xB=%%#

echo %xB%

pause & exit /b

*/

WScript.StdOut.WriteLine(bytes2xB(parseInt(WScript.Arguments.Item(0).replace(/,/g, ""),10)));

function bytes2xB(bytes) {

  var sizes = new Array(' Bytes',' KB',' MB',' GB',' TB');

  if (bytes === 0) return 0 + sizes[0];

  var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);

  if (i === 0) return bytes + sizes[i];

  return (bytes / Math.pow(1024, i)).toFixed(1) + sizes[i];

}

 

2) vbs ; wsf 구조 이용, 파일 하나에 job을 여러가지 포함시킬 수 있는 장점이 있는 것 같습니다.

batch+wsf-hybrid.bat

- 참고 ; https://riptutorial.com/batch-file/example/31022/embed-vbscript-code-into-batch-file-without-using-temporary-files

 

@echo off

set folder=%USERPROFILE%\Documents

for /f "tokens=2,3" %%a in ('dir /s/a "%folder%"') do if %%a==파일 set siz=%%b

::set siz=%siz:,=%

for /f "tokens=*" %%# in ('cscript "%~f0?.wsf" //nologo //job:VBS "%siz%"') do set Docsize=%%#

echo %Docsize%

pause

exit /b %errorlevel%

 

<package><job id="VBS"><script language="VBScript">

WScript.Echo ConvertSize(WScript.Arguments.Item(0))

Function ConvertSize(byteSize) 

  dim Size

  Size = byteSize

  Do While InStr(Size,",") 'Remove commas from size 

    CommaLocate = InStr(Size,",") 

    Size = Mid(Size,1,CommaLocate - 1) & _ 

    Mid(Size,CommaLocate + 1,Len(Size) - CommaLocate) 

  Loop

  Suffix = " Bytes" 

  If Size >= 1024 Then suffix = " KB" 

  If Size >= 1048576 Then suffix = " MB" 

  If Size >= 1073741824 Then suffix = " GB" 

  If Size >= 1099511627776 Then suffix = " TB" 

  Select Case Suffix 

    Case " KB" Size = Round(Size / 1024, 1) 

    Case " MB" Size = Round(Size / 1048576, 1) 

    Case " GB" Size = Round(Size / 1073741824, 1) 

    Case " TB" Size = Round(Size / 1099511627776, 1) 

  End Select

  ConvertSize = Size & Suffix 

End Function

</script></job></package>

 

 

4. batch file only

Bytes2xB.bat , bytes2xB.vbs 

- 정확도가 조금 부족하지만 대충 사용할 수 있을 것 같습니다. 용량에 따라서 Bytes, kB, MB, GB, TB 로 출력해줍니다.

- 정확도 확인을 위해서 외부 vbs로 계산한 결과도 같이 출력되게 하였습니다.

- 사용법; Bytes2xB.bat "파일 또는 폴더 경로"

 

@echo off

 

echo Select-Item : %~f1

if exist "%~f1\" (for /f "tokens=2,3" %%a in ('dir /s/a "%~f1"') do if %%a==파일 set bytes=%%b) else set bytes=%~z1

 

call :xB "%bytes%" size

echo Batch  Only : %size%

 

for /f "tokens=*" %%# in ('cscript //Nologo bytes2xB.vbs "%bytes%"') do set size=%%#

echo Batch + VBS : %size%

 

echo. & pause & exit /b

 

 

:xB <bytes> <variable>

setlocal

set B=%~1

set B=%B:,=%

set K=%B:~0,-3%

set M=%B:~0,-6%

set G=%B:~0,-9%

set T=%B:~0,-12%

 

if "%K%"=="" (set N=%B%& set D=1& set U=Bytes

) else if "%M%"=="" (set N=%B%0& set D=1024& set U=KB

) else if "%G%"=="" (set N=%B%& set D=104857& set U=MB

) else if "%T%"=="" (set N=%K%& set D=107374& set U=GB

) else set N=%M%& set D=109951& set U=TB

 

if %U%==KB set /a H=%N%0/%D%

if %U%==MB set /a H=%N%/(%D:~0,-1%+1)

if %U%==GB set /a H=%N%/(%D:~0,-1%+1)

if %U%==TB set /a H=%N%/%D:~0,-1%

 

if %H:~-1% geq 5 set L=1

set /a R=N/D+L

if not %D%==1 if %R% gtr 9 (set R=%R:~0,-1%.%R:~-1%) else set R=0.%R%

 

endlocal & set %~2=%R% %U%& exit /b

 

 

배치파일에 닷넷 콜솔앱을 포함시키는 등 여러 활용법들이 있는 것 같습니다. 이전에 올린 관련 글 링크

- https://windowsforum.kr/review/17828079

- https://windowsforum.kr/lecture/18830777

 

 

새해인가 싶더니 벌써 3월이네요. 좀 더 시간을 아껴 써야 겠습니다. 편히 주무십시오.^^;

번호 제목 글쓴이 조회 추천 등록일
[공지] 강좌 작성간 참고해주세요 gooddew - - -
4360 소프트웨어| 엑셀 추가기능; Reading Layout(셀 좌표) 1.4 [25] 지후빠 2140 27 11-18
4359 소프트웨어| ventoy.json 꿀팁-1 [12] 메인보드 6397 27 06-17
4358 소프트웨어| PE.WIM DPI%, IconSize 변경 배치! [15] 무월 1899 27 01-11
4357 윈 도 우| PE 수정 스크립트 V3.87 [12] 히이이잌 2627 27 12-20
4356 기 타| [팁] PE에서 wim 부팅하는데 필요한 boot.sdi [12] suk 3763 27 04-24
4355 윈 도 우| [정리] 인텔 cpu 보안 패치파일 정리해봤습니다 [32] suk 6370 27 01-09
4354 윈 도 우| 드라이브스넵샸 자동백업및복구 [56] 난이나팔자 8247 27 02-17
4353 윈 도 우| 나만의 PE를 만들자 실전편 3탄 PE고수되기1편 (윈도우10PE... [97] 지연서연아 8692 27 09-01
4352 소프트웨어| Office Deployment Tool (ODT) 를 배워봅시다. [26] 디폴트 9894 27 10-29
4351 소프트웨어| 오브젝트독(Object Dock) 이용하기 - (본문 수정) [37] 고양이2 5837 27 12-07
4350 소프트웨어| (2013.11.09) 수정본 다시 보내드렸습니다 [112] 고양이2 9916 27 11-08
4349 소프트웨어| 【PE】Win10XPEooo 빌더로 초간편 PE만들기 [17] qnd 3133 27 08-13
4348 소프트웨어| 오프라인 윈도우 드라이버 백업 [10] 카멜 1603 26 02-29
4347 윈 도 우| [3탄] PE빌드를 위한 누적 업데이트 통합 (Winre.wim + ins... [14] 무월 1295 26 08-25
4346 소프트웨어| 단순한 팝업 메뉴형 런처 PopSel (실컴,PE) [18] 지후빠 2460 26 03-30
4345 윈 도 우| 구글 검색 결과를 가장한 리다이렉션 광고 링크 제거하기 (... [11] 오호라7 4087 26 02-26
4344 소프트웨어| PE를 VHD에 설치하고 등록하기-vhdman [6] 카멜 1478 26 03-29
4343 소프트웨어| 구글드라이브 다운로드 배치파일 1차 / AHK 추가 [20] 지후빠 2991 26 08-25
4342 소프트웨어| WimBootBR 일회성 윔부트, C드라이브 백업/복원 cmd [37] 지후빠 3448 26 10-03
4341 윈 도 우| Administrator ==> User [15] @카리스마 4354 26 04-02
XE1.11.6 Layout1.4.8