기 타 배치 파일에서 폴더의 용량 단위 변환 표시
2023.02.28 20:50
사용한 du64.exe는 아래 사이트에서 다운로드하여 Windows 폴더에 복사하고 사용합니다.
https://learn.microsoft.com/en-us/sysinternals/downloads/du
@echo off
du64.exe -q C:\Users\Administrator\Documents > Docsize.txt
for /f "tokens=2" %%e in ('find "Size: " Docsize.txt') do set Docsize=%%e
echo %Docsize% bytes
pause
exit
위처럼 작성하면
%Docsize% 값으로 폴더 용량이 2,553,173 처럼 bytes로 표시가 되는데,
이 bytes 숫자 값이
1메가 이상인 경우 MB 단위로,
1기가 이상인 경우 GB 단위로,
1테라 이상인 경우 TB 단위로
자동으로 변환되어 나타나게 할 수 있는지 궁금하여 질문 올립니다.
댓글 [24]
-
빨강모자 2023.03.01 01:09 -
가로등 2023.03.01 10:22
링크해 주신 내용 살펴보도록 하겠습니다. 답변 주셔서 감사합니다.
-
메리아 2023.03.01 09:29
순수 배치파일로는 무리입니다
파워셸이나 vbs를 이용하셔야합니다
왜냐하면 배치파일에서 다루는게 가능한 숫자는 32비트로 제한되기 때문입니다.
파일 용량이 4GB 못넘는 FAT32 파티션 아시죠?
이 4GB가 그냥 정해진게 아니라 2의 32승 바이트가 4GB이기 때문입니다.
참고로 리눅스의 경우 과거 파티션 중에 2GB 제한인 파티션도 있습니다.
이는 2의 31승이죠. 이렇게 된 이유는 양수 음수를 동시에 쓰는 signed로 해버렸기 때문입니다.
마찬가지로 배치파일에서도 32비트 숫자만 연산가능한데
역시 음수를 같이 계산하므로, 2GB에 해당하는 수치가 넘어가면 에러납니다.
즉, 대상이 2GB 미만일때만 위 댓글과 같은 수법이 가능합니다.
2GB가 넘어가면 순수 배치파일 문법으로는 무리가 됩니다.
파워셸이나 vbs에서 계산해서 넘겨받아야합니다.
저도 해본적없어서 잘 모르는 부분이라 파워셸 링크는 하나 찾아서 남깁니다.
https://techibee.com/powershell/convert-from-any-to-any-bytes-kb-mb-gb-tb-using-powershell/2376
-
메리아 2023.03.01 10:02
저도 필요할거 같아 만들어봤습니다
무조건 GB로 표시한다면?
powershell $out=%Docsize%/1GB; echo $out.ToString(\"#0.00 GB\")
본문처럼 세부적으로 할 경우(한줄로 묶은 명령)
powershell $out=[double]%Docsize%; if($out -lt 1KB) { echo $out}elseif ($out -lt 1MB) { $out = $out / 1KB; echo $out.ToString(\"#0.00 KB\")}elseif ($out -lt 1GB) { $out = $out / 1MB; echo $out.ToString(\"#0.00 MB\")}elseif ($out -lt 1TB) { $out = $out / 1GB; echo $out.ToString(\"#0.00 GB\")}else { $out = $out / 1TB; echo $out.ToString(\"#0.00 TB\")}
위 내용을 풀어쓰면
powershell
$out=[double]%Docsize%;
if($out -lt 1KB) {
echo $out
}
elseif ($out -lt 1MB) {
$out = $out / 1KB;
echo $out.ToString(\"#0.00 KB\")
}
elseif ($out -lt 1GB) {
$out = $out / 1MB;
echo $out.ToString(\"#0.00 MB\")
}
elseif ($out -lt 1TB) {
$out = $out / 1GB;
echo $out.ToString(\"#0.00 GB\")
}
else {
$out = $out / 1TB;
echo $out.ToString(\"#0.00 TB\")
}
이렇게 됩니다. -
가로등 2023.03.01 10:34
답변 주셔서 감사합니다.
저도 검색에서 아래와 같은 vbs 파일 내용을 보았는데
위 배치파일에서 활용 가능할지 모르겠습니다.
convertSize.vbs
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
-
메리아 2023.03.01 12:39
당연히 될겁니다
다만 vbs나 ps1 파일로 된거는 추가로 파일이 필요하니까 그게 조금 거슬리지만
상관없다면 편집하기 편해서 좋습니다.
저도 원래 vbs를 애용하는데
파워셸은 문법도 조금 아는 수준입니다만, 위와같이 파일없이 한줄로 표현하기 편해서 요즘 애용하고 있습니다.
어차피 내용이야 검색하면 다 나오니 기본적인거 조금 대충 알면 만들죠 ㅋ
-
가로등 2023.03.01 14:12
저는 완전 초보라서 배치파일에서 vbs를 어떻게 활용하는지도 잘 모르는 수준입니다.
가능하다고 하시니 알아보도록 하겠습니다. 감사합니다.
-
kernel 2023.03.01 14:22
C# 도 파워쉘 처럼 스크립트가 가능하고, 파워쉘 보다 C# 이 할수 있는 영역이 훨씬 더 크고 많죠.
using System;
namespace ConsoleApp1 {
internal class Program {
static string UnitSize(UInt64 size) {
if (size < 1024) { return $"{size} bytes"; }
var delta = (int)(Math.Log(size) / Math.Log(1024));
return $"{size / Math.Pow(1024, delta):F2} {("KMGTP")[delta - 1]}B";
}
static void Main(string[] args) {
Console.WriteLine(UnitSize(5943243681024));
}
}
}
또한 C#도 Roslyn API 이용해서 파워쉘 처럼 파일 없이 한줄로 표현하게 하는 것도 가능.파워쉘 보다 C#으로 할 수 있는 것들이 훨씬 많음. -
가로등 2023.03.01 15:10
글 올려주셔서 감사합니다.
-
zerojiddu 2023.03.01 15:18 C#가 스크립트가 가능하단게 무슨말인가요? 첨 들어보는데.
파워쉘 명령어들이(cmdlet) C#로 많이 만들었어요. 파워쉘 명령어 Add-Type 가 C# 코드나 .cs 파일을 .exe 를 않만들고 메모리상에서 바로 컴파일하는 기능이예요. -
kernel 2023.03.01 15:27
Making Your Life Easier with C# Scripting -- Visual Studio Magazine
기본적인 내용은 위 사이트 참고하면 될 듯 하고....
Roslyn API 이용해서 파워쉘 처럼 파일없이 한줄로 사용하게 만드는 것도 가능.
C#이 컴파일 해서 .exe 나 .dll 어셈블리 모듈을 만들어서 사용 할 수 도 있지만
스크립트로 실행하는 것도 이미 오래 전 부터 가능했음.
-
zerojiddu 2023.03.01 16:35 올리신 링크보니,
파워쉘, cmd 에서 필수적으로 쓰는 기능은 안된다네요.
비쥬얼 스튜디오를 깔아야되고 그속에서 전체코드 컴파일 안하고 스크립트식으로 한줄씩, 한구문씩 바로 확인하는 기능이네요.
윈도상에서 일반적으로 쓰는 스크립트는 아닌거 같습니다.
Sadly, the CSI command prompt doesn't support any folder navigation and management commands (e.g. cd, dir, etc.) so there's no built-in way to navigate to the folder -
kernel 2023.03.01 17:58
C# 스크립트가 처음이라 믿기지 않나 보네요. 하하.
파워쉘은 도스 시대의 코맨드라인 텍스트 버전인 배치 스크립트를 대체하기 위해 만들어진 일종의 Shell이라서
디렉토리를 바꾸거나 열거하는 기능을 갖고 있는 것에 불과한 거고, 스크립트 기능 자체와는 본질적으로 무관한 거죠.
CSI C# 스크립트 Environment 는 파이썬 쉘 처럼... Interactive 하게 C# 코드를 실행할 목적으로 만들어진 거고
디렉토리를 바꾸거나 열거하는 것은 부가적인 쉘 기능에 불과할 뿐, 스크립트와는 본질적으로 무관 합니다.
C# 스크립트 파일을 다음과 같이 작성했다고 합시다
<test.csx>
using System;
using System.IO;
class Program {
public string UnitSize(Int64 size) {
if (size < 1024) { return $"{size} bytes"; }
var delta = (int)(Math.Log(size) / Math.Log(1024));
return $"{size / Math.Pow(1024, delta):F2} {("KMGTP")[delta - 1]}B";
}
}
var o = new Program();
DriveInfo[] drvs = DriveInfo.GetDrives();
foreach (var d in drvs) {
if (d.IsReady)
Console.WriteLine(d.Name + " Disk Free Space = " + o.UnitSize(d.TotalFreeSpace) );
}
-
지후빠 2023.03.01 17:06
배치파일과 VBS 이용하여 다음처럼 할 수 있습니다. (VBS에는 한 줄 추가)
속도면에서 불리할 수 있지만 du64 ->dir /s/a 로 대체해봤습니다.(du64 불필요)
외부라서 귀가 후 파일 하나로 좀 더 단순화 해보겠습니다. ^^
-
가로등 2023.03.01 20:29
vbs를 배치파일에서 활용하는 방법을 전혀 몰랐었는데,
OS 드라이브의 문서 폴더로 5기가 이상의 단일 파일 등을 복사해 넣고,
PE에서 올려주신 파일로 테스트 해보니, GB 단위로 아주 잘 표시됩니다.
PE에서 운영체제가 설치된 사용자 폴더의 백업 및 복원을 위한 배치 파일을 작성하면서 궁금한 내용이었는데,
많은 도움이 되었습니다.
좋은 활용법을 가르쳐주셔서 감사합니다.
-
지후빠 2023.03.01 17:51
(외부에서 기다리는 동안) 파워쉘 이용하는 파일 한개짜리 버전 만들어 봤습니다.^^
doc_size_w_ps.cmd운전중 생각 나서 조금 수정하였습니다.
-
kernel 2023.03.01 18:38
C++ 공부는 좀 해요? 60 훨씬 넘은 이 늙은이도 공부를 계속 하는데...
-
지후빠 2023.03.01 19:10
커널님 안녕하십니까? ^^
작년에 powershell 책 한권 독학했는데 안쓰니 머리에 남는 것이 별로 없는 것 같습니다.ㅜㅜ
올해는 C# 책 한권 보고 있는데 마찮가지로 안쓰니 진도가 안나갑니다. 1/5쯤...
권해주신 C++은... 배우고 싶은 것과 사용하는 것과의 갭이 커서... 반성합니다. ㅠㅠ
-
kernel 2023.03.01 18:02
위의 <test.csx> C# 스크립트 코드를 다음과 같이 실행하면
디스크 프리 공간을 출력할 겁니다.
-
kernel 2023.03.01 18:05
C# 개발을 전문적으로 하는 개발자들을 위해 MS에서 제공해 주고있는 CSI는 위에서 언급한대로
파이썬 환경 처럼 Interactive한 접근방식을 위주로 구현되어 있기 때문에....
스크립트 기능을 확장해서 쓰고 싶다면 앞서 언급한 대로 Roslyn API 이용해서 CSI 를 대체하는
Script Execution Environment 를 구현해서 쓰면 됩니다.
-
zerojiddu 2023.03.01 18:52 네. 그 코드로 .csx 저장해
csi.exe 로 확인해봤습니다.
음.. 물어볼게 더 있지만 일단 알겠습니다.
C# 스크립트 기억해두고 차차 알아가겠습니다.
-
메리아 2023.03.01 20:07
C# script라는게 존재하는줄은 처음 알긴 했습니다만
문제가 조금... 아니 많이 심각하게 있네요.
이거 VS 깔아야만 되는거 아닌가요?? 그것도 구버전은 안되고 최소 VS 2015는 깔아야 되는거네요?
기본적으로 스크립팅 얘기는 "무설치"나 "극히 가벼운 설치"가 기준이어야하는데
비주얼 스튜디오를 깔아야한다니... 스크립팅이 가능한게 문제가 아니라
작성과 실행 자체가 너무 고용량 설치가 필요한게 좀 문제가 크다고 봅니다.
-
kernel 2023.03.01 21:00
Visual Studio를 설치해야만 하는 건 아니고, 단독으로 설치해서 쓰면 될 일이고....
앞서 언급했듯이 CSI 구현방식이 마음에 안들면 직접 Script Execution Environment 를 구현해서 쓰면 될 일.
파워쉘은 ...
C:\Windows\System32\WindowsPowerShell\v1.0 와...
C:\Windows\SysWOW64\WindowsPowerShell\v1.0 에...
두 곳에 설치되어 있는 것을 감안하면 단독으로 CSI 를 설치해서 쓰는 게 더 가벼운 환경 임.
C#을 자유롭게 다룰 줄 알면...
Roslyn API 이용해서 CSI 를 대체하는 Execution Environment를 Light-weight로 만들어 쓰면 될 일이고.
스크립트 엔진 자체는 파워쉘이 더 무거워요.
-
메리아 2023.03.01 22:10
설치 링크는 어디에 있나요?
"C# scripting interface download"
이정도 검색해서 안나올 정도면 설치가 쉬운거 같지도 않군요.
(csi 검색하면 미드만 나와서 골때립니다 ㅋㅋㅋ)
아무튼 대개 배치파일을 요구할땐 기본 설치조차 꺼려하는 경우가 많은데
범용적으로 쓰기는 어렵겠군요
이런건 마소에서 알아서 넣어줘야할일인데, 혹시 저 모르게 윈11에는 있고 그런가요??
다운링크조차 찾을수가 없어서 설치하는데 얼마나 들어갈지 몰라서 모르겠는데
일단 뭐 닷넷을 이용할테니 용량 많을거 같진 않기는 합니다만...
근데 파워셸의 경우 2군데 있다고 해서 많은거도 아니고 합해서 1MB도 안넘네요.
뭐 보조파일이 더 있는지는 모르겠습니다만...
CSI만 설치시 차지하는 용량은 얼만가요? 많을거 같진 않긴 한데...
저게 범용성만 있으면 바로 갈아탈건데 슬프군요.
갑갑한 배치파일,파워셸,vbscript를 쓰느니 저게 편한데...
번호 | 제목 | 글쓴이 | 조회 | 등록일 |
---|---|---|---|---|
[공지] | 질문과 답변 게시판 이용간 유의사항 | gooddew | - | - |
96264 | 윈 도 우| CLSID 값이 어떻게 될까요? [2] | dreamsbk1 | 307 | 03-01 |
» | 기 타| 배치 파일에서 폴더의 용량 단위 변환 표시 [24] | 가로등 | 892 | 02-28 |
96262 | 소프트웨어| 사진 4장씩 보이게 해서 4A 사이즈로 설정하고 jpeg 등으로... [4] | 예스어데이 | 738 | 02-28 |
96261 | 윈 도 우| 11.22621 설정의 에너지 사용량 경고 없엘 수 있을까요? | DarknessAn | 215 | 02-28 |
96260 | 윈 도 우| ghost spectre 아시는분 질문 드려봅니다. [5] | 이제부터아 | 479 | 02-28 |
96259 | 하드웨어| GPU 메모리는 작업 후 메모리 반환이 안되나요? [7] | feynman | 640 | 02-28 |
96258 | 기 타| 매개 변수 이름:value | 쌘돌 | 210 | 02-27 |
96257 | 소프트웨어| 리눅스 간단한거 하나만 여쭤볼게요. [13] | reg | 704 | 02-27 |
96256 | 소프트웨어| 포토샵 사용하는 방법 [4] | 맨션에살자 | 881 | 02-27 |
96255 | 윈 도 우| 윈도우 11 에서 더 이상 부팅 메뉴 레거시(고전 검정) [10] | 로락이 | 935 | 02-27 |
96254 | 소프트웨어| CPU 이름 출력하는 C/C++ 프로그램 [7] | 나는나다 | 924 | 02-26 |
96253 | 하드웨어| 라이젠 3700X와 5600과의 차이? [8] | 개척자 | 1213 | 02-26 |
96252 | 하드웨어| Usb 포맷 [1] | 양말 | 700 | 02-26 |
96251 | 소프트웨어| ventoy 관련 문의 [3] | 한스 | 722 | 02-26 |
96250 | 윈 도 우| wifi 자동연결 질문 [3] | 네오틱 | 618 | 02-26 |
96249 | 소프트웨어| SSD S.M.A.R.T 오류뜨면 윈도우 재설치 해야 하나요? | 바이오스 | 302 | 02-26 |
96248 | 윈 도 우| 안녕하세요~멀티 등록에 관한 질문 입니다~ [1] | 거스 | 238 | 02-26 |
96247 | 윈 도 우| Edge 동기화를 초기화 방법이 긍금합니다. [4] | 이슬 | 410 | 02-25 |
96246 | 윈 도 우| 윈10에서 윈11 설치 문의 드립니다. [1] | 레드2 | 387 | 02-25 |
96245 | 하드웨어| 경쟁이 심한경우 인터넷속도와 시스템성능 어느게 유리한가요? [7] | 좋은데이 | 681 | 02-25 |
참고용 의견 링크입니다.
https://superuser.com/questions/1135707/get-file-size-in-kb-mb-gb-in-windows-batch-file
https://superuser.com/questions/1265154/windows-how-to-convert-batch-program-output-of-bytes-to-kb-mb-or-gb
>> set /a result1=%bytes% / 1024