6

バッチ ファイルの空きディスク容量の整数を取得しようとしています。これは私の(非常に)単純なコードです。

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

ただし、freespace.log ファイルに出力されます。

FreeSpace    
9772687360   
57401442304  
7346626560   
0            
0            

整数のみと合計を選択する必要があります。このような合計出力の後。

74520756224

最善を尽くして Google で検索しましたが、解決策が見つかりません。私を助けてください:)

4

4 に答える 4

4

これは、ハイブリッド バッチと powershell を使用した正確なソリューションです。これは、純粋な powershell、vbscript、または jscript を使用して実行する必要があります。

トークンと IF ステートメントの非直感的な使用は、FOR /F と WMIC の Unicode 出力の間の奇妙な相互作用を補うためです。

@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%
于 2012-10-28T13:42:06.497 に答える
1

以下のコードを使用します。captionテキストをdeviceidif it shows?または blankに置き換えてみてください。

@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"
于 2012-10-28T07:37:39.850 に答える
1

以下は、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%
于 2015-10-27T00:26:47.753 に答える
1

PowerShell(または少なくともVBScriptまたはJScript)に切り替えるという@dbenhamの推奨事項に2番目に同意します。ただし、バッチに固執し、正確な数が必要ない場合は、次のようにすることができます。

@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

この行set val=!val:~-6!は、各値から最後の 6 桁を削除します。そうすれば、バイトではなくメガバイトで計算できますが、値が切り捨てられる (そして正しく丸められない) ため、(明らかに) いくらかの精度が失われます。

于 2012-10-28T13:05:17.530 に答える