Перебирайте диски и выводите размер и пространство - PullRequest
0 голосов
/ 03 марта 2020

Этот код возвращает размер диска и пространство в ГБ. Проблема в том, что он использует только C, и мне нужно жестко его кодировать.

Я пытаюсь сделать так: он должен перебирать все диски, и мне не нужно записывать диск расстаться Все мои эксперименты провалились, я не мог решить.

for /f "tokens=1-3" %%n in ('"WMIC LOGICALDISK GET Name,Size,FreeSpace | find /i "C:""') do set free=%%n& set total=%%p
set free=%free:~0,-3%
set /a free=%free%/1049
set total=%total:~0,-3%
set /a total=%total%/1049

set /a free=%free%/1024
echo C: Space Free- %free% GB
set /a total=%total%/1024
echo C: Space total- %total% GB

Ответы [ 3 ]

2 голосов
/ 03 марта 2020

Как то так? Это немного неаккуратно, но я думаю, что он делает то, что вы просите, используя пакет, который вы (в основном) написали.

Я использую функцию пакета , чтобы вывести переменные из / фл oop. Вы могли бы также использовать отложенное расширение . Я нахожу весь синтаксис! раздражает, но кажется, что большинство людей предпочитают его пакетным функциям.

@echo off

for /f "tokens=1-3" %%n in ('"WMIC LOGICALDISK GET Name,Size,FreeSpace"') do call :calculate "%%n" "%%o" "%%p"
goto :EOF 

:calculate
set free=%~1
set drive=%~2
set total=%~3

if "%drive%"=="" goto :EOF
if not "%drive:~1%"==":" goto :EOF
echo ---- information for drive %drive% ----
set free=%free:~0,-3%
set /a free=%free%/1049
set total=%total:~0,-3%
set /a total=%total%/1049
set /a free=%free%/1024
echo Free- %free% GB
set /a total=%total%/1024
echo Total- %total% GB
goto :EOF
1 голос
/ 04 марта 2020

Ниже приведена часть скрипта, который я ранее написал для получения информации о диске, которая отображается на экране, записывается в текстовый файл, а также в CSV.

@echo off
set "pathBackup=C:\backup"
set "infoFileName=%computername%_DriveSize.txt"
set "csvFile=All_DriveSizes.csv"

::Fix for CSV format output error on some systems
if exist "%WINDIR%\System32\wbem\en-us\csv.xsl" (
    set csvformat="%WINDIR%\System32\wbem\en-us\csv"
) else (
    set csvformat=csv
)

:: Get Drive Partition information
echo.             - Looking for Drive sizes
setlocal EnableDelayedExpansion
for /f "skip=2 tokens=2-5 delims=," %%a in ('wmic logicaldisk where (DriveType^="3"^) get DeviceID^,FreeSpace^,Size^,VolumeName /format:%csvformat%') do (
    set "diskID=%%a"
    set "diskSpace=%%b"
    set "diskSize=%%c"
    set "diskName=%%d"
    set /a diskSize1=!diskSize:~0,-4! / 107374
    if "0"=="!diskSize1!" (
        set /a diskSize1=!diskSize! / 1048576
        set diskSize1=0.!diskSize1:~0,-2!
    )
    set /a diskSpace1=!diskSpace:~0,-4! / 107374
    if "0"=="!diskSpace1!" (
        set /a diskSpace1=!diskSpace! / 1048576
        set diskSpace1=0.!diskSpace1:~0,-2!
    )
    set driveSizes=!driveSizes!"[%%a] %%d (!diskSize1!:!diskSpace1!)",
)

endlocal&if "_%~2"=="_" (set driveSizes=%driveSizes:~0,-1%)
:: Create non CSV variable for use in CSV file creation
set driveSizescsv=%driveSizes:"=%
set driveSizescsv="%driveSizescsv%"

Бит, отображающий экран и записывает в текстовый файл ...

echo PC Drives : [Drive] Label (Size GB:Free GB)>>"%pathBackup%\%infoFileName%"
echo PC Drives : [Drive] Label (Size GB:Free GB)
:: Write individual drives one at a time
setlocal EnableDelayedExpansion
for %%i in (%driveSizes:,= %) do (
    set driveSizes1=%%i
    echo.            !driveSizes1:"=!
    set driveSizes2=!driveSizes1:"=!
    echo.            !driveSizes2!>>"%pathBackup%\%infoFileName%"
)
endlocal

Бит, который записывает в CSV

echo %computername%,%driveSizescsv% >>"%pathBackup%\%csvfile%"

Пример вывода ..

PC Drives : [Drive] Label (Size GB:Free GB)
            [C:] Windows (79:42)
            [D:] Database Volume (599:90)
            [E:] Log File (39:31)
0 голосов
/ 03 марта 2020

Поскольку команда может занять некоторое время, а арифметика c может быть особенно сложной в чистом пакетном режиме, вот пара дополнительных опций, которые используют другие встроенные языки сценариев:

Этот полный использует :

@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP^
 "[System.IO.DriveInfo]::GetDrives()|?{$_.IsReady -Eq $True}|"^
 "Select @{N='Drive';E={$_.Name.TrimEnd('\')}},"^
 "@{N='Size (GiB)';E={[Double]('{0:N2}' -F ($_.TotalSize/1GB))}},"^
 "@{N='Free (GiB)';E={[Double]('{0:N2}' -F ($_.AvailableFreeSpace/1GB))}}|FL
@"%__AppDir__%timeout.exe" /T 5 /NoBreak>NUL

И это еще быстрее использует движок :

<!-- :
@"%__AppDir__%cscript.exe" //NoLogo "%~f0?.wsf"
@"%__AppDir__%timeout.exe" /T 5 /NoBreak>NUL
@Exit /B
-->
<Job><Script Language="VBScript">
Set o=CreateObject("Scripting.FileSystemObject")
For Each Drv In o.Drives:If Drv.IsReady=True Then
  WScript.Echo "Drive="&Drv.DriveLetter&":"&VBCrLf&_
  "Size="&Round(Drv.TotalSize/1073741824,2)&" GiB"&VBCrLf&_
  "Free="&Round(Drv.FreeSpace/1073741824,2)&" GiB"
End If:Next
</Script></Job>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...