소프트웨어 배치파일로 2GB 이상 계산과 batch hybrid
2023.03.05 22:29
안녕하세요?
질문 글에서 모자님 링크 보고 아이디어가 떠올라서 만든 내용과 배치 하이브리드에 대한 정보입니다.
모자님 감사합니다.^^
정확도는 조금 떨어질 수 있지만 마지막에 순수 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
3) vbs, js 이용 ; 4번에 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 파일 내보내서 실행
@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 이용
@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을 여러가지 포함시킬 수 있는 장점이 있는 것 같습니다.
- 참고 ; 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
- 정확도가 조금 부족하지만 대충 사용할 수 있을 것 같습니다. 용량에 따라서 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월이네요. 좀 더 시간을 아껴 써야 겠습니다. 편히 주무십시오.^^;
댓글 [7]
-
cungice 2023.03.05 22:33
-
가로등 2023.03.05 23:41
여러가지 다양한 방법들을 소개해 주셔서 감사합니다.
-
왕초보 2023.03.06 00:04
이렇게 신기한 방법들이 있었네요..
좋은 강좌를 해주셔서 감사합니다
-
뻐드렁니 2023.03.06 01:17
우와.. 정말 여러가지 방법이 있군요... 감사합니다.
-
샤 2023.03.06 23:03
수고하셨습니다.
-
슈머슈마 2023.03.09 17:39
감사합니다.
그런데 혹시 뭐 하시는 분일까요?
오레전에 배치파일에 관심이 있어서 배치파일 교재를 사보면
꼭 이런식으로 배치파일 코드가 짜여져 있던데 -_-
혹시 책도 쓰고 그런분은 아니시겠죠? 지후빠님 보면 정말 궁금하네요.
혹시 다른 프로그램은 오토핫키 말고 다른언어 코드는 안하시나요?
-
지후빠 2023.03.10 09:22
슈마님 안녕하세요?
필요할때 찾아서 조금씩 공부하고 있습니다. 비전문가로서 주로 스크립트 활용하는 end user 입니다.^^
번호 | 제목 | 글쓴이 | 조회 | 추천 | 등록일 |
---|---|---|---|---|---|
[공지] | 강좌 작성간 참고해주세요 | gooddew | - | - | - |
4283 | 소프트웨어| [펌]VirtualBox 로컬 드라이브 연결하기 [2] | 타천사둘리 | 1446 | 9 | 03-23 |
4282 | 윈 도 우| PC 나 노트북 종료시 전원차단 안 될 때 조치방법 [6] | 타천사둘리 | 2982 | 6 | 03-21 |
4281 | 윈 도 우| Wifi 패스워드 (종료!!!) [27] | kernel | 6222 | 19 | 03-12 |
» | 소프트웨어| 배치파일로 2GB 이상 계산과 batch hybrid [7] | 지후빠 | 1465 | 13 | 03-05 |
4279 | 소프트웨어| 팁: VirtualBox 7의 Windows 10/11에서 NVMe 드라이버 활성... [3] | VᴇɴᴜꜱGɪ | 1236 | 9 | 03-05 |
4278 | 윈 도 우| 구글 검색 결과를 가장한 리다이렉션 광고 링크 제거하기 (... [11] | 오호라7 | 4158 | 26 | 02-26 |
4277 | 윈 도 우| 윈도우 업데이트 다운로드 및 설치 오류 조치 [6] | 미스라 | 3724 | 5 | 02-17 |
4276 | 모 바 일| 뉴진스 음악에서 보컬만 추출하기? 이거 하나면 끝!!! | mp... | toz21 | 1974 | 0 | 02-14 |
4275 | 윈 도 우| IE 강제 실행 스크립트 + 탭 여러개 열기 [5] | 녹색조각 | 2864 | 14 | 02-14 |
4274 | 기 타| 파이어 폭스 무설치 만들기 [17] | 슈머슈마 | 1628 | 9 | 02-12 |
4273 | 윈 도 우| 향상된 윈도우 자동 로그인 On/Off 스크립트 [6] |
|
2841 | 13 | 02-11 |
4272 | 소프트웨어| 현존 최강 무료 동영상 편집기 소개 및 활용법 안내 | 이게... [13] | toz21 | 2779 | 7 | 02-11 |
4271 | 소프트웨어| Pecmd.ini 위치를 Windows폴더로 이동 [6] | 카멜 | 813 | 10 | 02-10 |
4270 | 윈 도 우| 파일을 디펜더가 차단할때, 파워쉘로 허용시키기 [7] |
|
1823 | 14 | 02-06 |
4269 | 윈 도 우| 강제로 Internet Explorer 열기 스크립트 [13] | 사랑이7 | 3186 | 21 | 02-05 |
4268 | 윈 도 우| 윈도우11 $OEM$소스 및 WinNTSetup 응용 설치! [40] | 무월 | 3640 | 51 | 02-03 |
4267 | 윈 도 우| 윈도우 부팅시 신용카드 정보를 요구할때 넘어가기 [5] | 고장난우주 | 2505 | 1 | 02-01 |
4266 | 윈 도 우| 감춰진 모든 고급 전원옵션 표시하기 [4] |
|
2261 | 13 | 01-30 |
4265 | 윈 도 우| 특정 폴더 내 임의 파일/폴더 선택 배치 함수 [10] | 지후빠 | 780 | 16 | 01-29 |
4264 | 윈 도 우| 프로그램 필요없이, 윈도우 설치 USB 만들기 [16] |
|
5800 | 27 | 01-18 |
수고 많으셨습니다. 감사합니다.