2013-06-22 62 views
4

我需要一個bat文件來獲得C:\驅動器總空間和可用空間在GB(千兆字節)在Windows系統中可用,並創建一個文本文件與細節。Windows批處理文件得到C:驅動器總空間和可用空間可用

注意:我不想使用任何外部實用程序。

+0

我沒有看到一個編程問題(對於任何問題那件事)。即使你改寫成一個適當的編程問題,也沒有使用本地批處理的解決方案,因爲本地批處理無法對當今磁盤驅動器中會看到的大數字執行數學運算。純本地批處理可以提供可用字節,但不提供免費GB。 – dbenham

+1

通過「外部工具」,你的意思是說你只想使用Windows(版本?,7?)附帶的東西,比如fsutil,wmic等?那麼PowerShell或VBScript呢?他們隨Windows一起發貨。 – mojo

回答

4

切口9的大小由字節的數字來獲得尺寸GB:

@echo off & setlocal ENABLEDELAYEDEXPANSION 
SET "volume=C:" 
FOR /f "tokens=1*delims=:" %%i IN ('fsutil volume diskfree %volume%') DO (
    SET "diskfree=!disktotal!" 
    SET "disktotal=!diskavail!" 
    SET "diskavail=%%j" 
) 
FOR /f "tokens=1,2" %%i IN ("%disktotal% %diskavail%") DO SET "disktotal=%%i"& SET "diskavail=%%j" 
(ECHO(Information for volume %volume% 
ECHO(total %disktotal:~0,-9% GB 
ECHO(avail. %diskavail:~0,-9% GB)>size.txt 
TYPE size.txt 

CMD可以用數字只計算高達2^31-1(2,147,483,647〜2.000001千兆字節)

+1

在我的Win7機器上沒有額外的空間或其他字符後的數字,所以長度應該是-9,而不是-10。此外,這只是接近GB。我想你知道這一點,但你的回答措辭可能會誤導一些人。 – dbenham

+0

輸出取決於本地/區域設置(如robocopy),現在我會將其更改爲「美式風格」。 GB值不是數學上正確的,可能會變化+/- 1GB,對於小容量更重要。 – Endoro

+1

您可以使用delims = space再添加一個FOR/F循環以從值中去除前導和尾隨空格。那麼你的答案不受區域設置的影響。 – dbenham

1

這可能不是在所有你想要的,因爲它使用PowerShell,但「外部工具」有點模糊,給我留下一些迴旋餘地。此外,它基本上是一個單線程。

SETLOCAL 

FOR /F "usebackq tokens=1,2" %%f IN (`PowerShell -NoProfile -EncodedCommand "CgBnAHcAbQBpACAAVwBpAG4AMwAyAF8ATABvAGcAaQBjAGEAbABEAGkAcwBrACAALQBGAGkAbAB0AGUAcgAgACIAQwBhAHAAdABpAG8AbgA9ACcAQwA6ACcAIgB8ACUAewAkAGcAPQAxADAANwAzADcANAAxADgAMgA0ADsAWwBpAG4AdABdACQAZgA9ACgAJABfAC4ARgByAGUAZQBTAHAAYQBjAGUALwAkAGcAKQA7AFsAaQBuAHQAXQAkAHQAPQAoACQAXwAuAFMAaQB6AGUALwAkAGcAKQA7AFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAoACQAdAAtACQAZgApACwAJABmAH0ACgA="`) DO ((SET U=%%f)&(SET F=%%g)) 

@ECHO Used: %U% 
@ECHO Free: %F% 

由於批處理/ CMD是壞在幾乎一切,我決定使用PowerShell,這是指對於這樣的東西,具有快速,方便地訪問WMI。

這裏的PowerShell代碼:

Get-WMIObject -Query "SELECT * FROM Win32_LogicalDisk WHERE Caption='C:'" ` 
    | % { 
     $f = [System.Math]::Round($_.FreeSpace/1024/1024/1024,1); 
     $t = [System.Math]::Round($_.Size/1024/1024/1024,1); 
     Write-Host ('' + ($t-$f) + ',' + $f); 
    } 

此吐出用逗號分隔的兩個值。現在,只要我們可以在FOR循環中做到這一點!

PowerShell有接受Base64編碼的命令(以消除逃逸,使代碼難以閱讀的需要)漂亮的能力,所以我們需要做的是儘可能縮小該命令可能的(減少編碼字符串的大小 - 嚴格地說是精確的,不是絕對必要的)。我也將大小縮小爲整數,這些整數將它們四捨五入。它至少比舍棄低位小數位更接近。

收縮的編碼命令,並在PowerShell中編碼它看起來像這樣:

$code = { 
gwmi Win32_LogicalDisk -Filter "Caption='C:'"|%{$g=1073741824;[int]$f=($_.FreeSpace/$g);[int]$t=($_.Size/$g);Write-Host ($t-$f),$f} 
} 
$enc = [convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($code)) 
Write-Host $enc 

(見的PowerShell /更多細節?)

我希望它可以任意的Win7或Win8的機器上運行存在。 PoSH代碼不依賴任何高級功能(除了可能的EncodedCommand位),所以如果PoSH安裝在XP或Vista機器上,它很可能會工作。我無法講述通過Windows Update推送PoSH的MS歷史,但我認爲這很有可能無處不在。

2

以任何方式不是一個完整的解決方案,但有人可能會有所幫助:

dir | find "bytes" 
0

這應該在批處理工作:

for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set space=%%S 
echo %space% 
相關問題