2012-10-28 28 views
6

Tôi đang cố lấy số nguyên đĩa trống trong tệp Batch. Đây là một mã đơn giản (rất) của tôi.Làm cách nào để lấy số nguyên của không gian đĩa trống trong tệp Batch?

@echo off 
wmic logicaldisk get freespace >> freespace.log 
exit 

Nhưng đầu ra trong tệp freespace.log.

FreeSpace  
9772687360 
57401442304 
7346626560 
0    
0    

Tôi chỉ cần chọn số nguyên và tổng kết. Sau khi kết quả tổng kết như thế này.

74520756224 

Tôi tìm kiếm trên Google là tốt nhất nhưng tôi không thể tìm thấy giải pháp. Xin hãy giúp tôi :)

+3

Tôi không có ý tưởng làm thế nào để làm điều này trong kịch bản hàng loạt, một VBScript hay JScript sẽ rất dễ dàng. – rekire

+1

lô không thể làm việc với số lớn hơn ~ 2 gigabyte (trừ khi bạn viết thói quen bổ sung của riêng bạn - số tiền vô lý của mã và công việc), vì vậy bạn không may mắn. Bạn thực sự nên sử dụng powershell, vbscript hoặc jscript. – dbenham

+0

Vì bạn không đề cập đến WMIC như một yêu cầu, tôi cho rằng nó chỉ được đưa vào như là nỗ lực của bạn cho một giải pháp. Thật không may, tất cả mọi người dưới đây đã lấy nó như là yêu cầu cho một số lý do và sử dụng nó trong câu trả lời của họ. WMIC không lý tưởng vì nó có hiệu suất kém so với trình thông dịch gốc. [Giải pháp này] (http://stackoverflow.com/a/7304937/119540) có hiệu suất tốt hơn nhiều vì nó tránh tất cả các chương trình bên ngoài. – Synetech

Trả lời

4

Đây là giải pháp chính xác sử dụng hàng loạt lai và quyền hạn. Nó thực sự cần được thực hiện với powerhell thuần túy, vbscript, hoặc jscript.

Việc sử dụng mã thông báo và câu lệnh IF không trực quan là bù cho tương tác kỳ lạ giữa FOR/F và đầu ra unicode của WMIC.

@echo off 
setlocal enableDelayedExpansion 
set /a freeSpace=0 
for /f "skip=1 tokens=1,2" %%A in ('wmic logicaldisk get freespace') do (
    if "%%B" neq "" for /f %%N in ('powershell !freeSpace!+%%A') do (
    set freeSpace=%%N 
) 
) 
echo freeSpace=%freeSpace% 
+0

Tôi đã làm được! Cảm ơn bạn rất nhiều: D – nakorndev

+1

Wow, WMIC và PowerShell trong cùng một tệp hàng loạt để chỉ nhận được không gian trống. Tôi lấy nó rằng hiệu suất không phải là mối quan tâm chính của bạn phải không? Các giải pháp quần ưa thích như thế này thuộc về [CodeGolf] (http://codegolf.stackexchange.com/) nhiều hơn ở đây hiệu suất là mong muốn. – Synetech

1

Sử dụng mã bên dưới. Hãy thử thay thế văn bản caption bằng deviceid nếu văn bản hiển thị ? hoặc để trống.

@echo off 
setlocal 
set drive=C 
set free=? 
rem Note: WMIC will output unicode text 
wmic logicaldisk where (caption = "%drive%:") get freespace>"%temp%\free.tmp" 
for /f %%A in ('type "%temp%\free.tmp"') do (set free=%%A) 
echo Free space: %free% bytes 
rem if exist "%temp%\free.tmp" del "%temp%\free.tmp" 
+0

Cảm ơn bạn đã trả lời. Tôi đã cố gắng để làm câu trả lời của bạn nhưng nó không hoạt động. Nó đã cho thấy "nhận được bất ngờ tại thời điểm này." và sau đó cửa sổ đã đóng. – nakorndev

+0

Xin lỗi, vì điều đó. Nó đã được sửa. – Jay

+0

Cảm ơn bạn đã trả lời. Nó làm việc bây giờ nhưng tôi muốn tổng hợp không gian đĩa miễn phí của tất cả các tập trên máy tính. :) – nakorndev

1

Tôi khuyên bạn nên chuyển sang PowerShell (hoặc ít nhất là VBScript hoặc JScript). Tuy nhiên, nếu bạn muốn gắn bó với hàng loạt và không cần con số chính xác bạn có thể làm một cái gì đó như thế này:

@echo off 

setlocal EnableDelayedExpansion 

for /f %%v in ('wmic logicaldisk get freespace ^| findstr /r "[0-9]"') do (
    set val=%%v 
    set val=!val:~-6! 
    set /a sum+=val 
) 

echo !sum! 

endlocal 

Dòng set val=!val:~-6! loại bỏ 6 chữ số cuối cùng từ mỗi giá trị. Bằng cách đó bạn có thể tính toán bằng MB thay vì Byte, nhưng (rõ ràng) mất một số độ chính xác, bởi vì giá trị bị cắt ngắn (và không được làm tròn chính xác).

1

Dưới đây là một giải pháp hàng loạt tinh khiết có thể xử lý số lượng nhiều hơn ~ 2G:

@echo off 
setlocal EnableDelayedExpansion 
set /A "SUMMEG=0" & set /A "SUMONE=0" 
set /A "NUM=6" & set "ZER=000000" 
for /F "tokens=2 delims==" %%F in (' 
    wmic LOGICALDISK GET FreeSpace /VALUE 
') do (
    for %%G in (%%F) do (
     set "ONE=%ZER%%%G" 
     for /F "tokens=* delims=0" %%H in ("!ONE:~,-%NUM%!") do set "MEG=%%H" 
     for /F "tokens=* delims=0" %%H in ("!ONE:~-%NUM%!") do set "ONE=%%H" 
     set /A "SUMMEG+=MEG" & set /A "SUMONE+=ONE" 
    ) 
) 
if not "!SUMONE:~,-%NUM%!"=="" (set /A "SUMMEG+=!SUMONE:~,-%NUM%!") 
set "SUMONE=%ZER%!SUMONE!" & set "SUMONE=!SUMONE:~-%NUM%!" 
for /F "tokens=* delims=0" %%H in ("%SUMMEG%%SUMONE%") do set "FRE=%%H" 
endlocal & if "%FRE%"=="" (set "FRE=0") else (set "FRE=%FRE%") 
echo %FRE% 
Các vấn đề liên quan