Windows卷获得大小,可用空间

时间:2016-11-09 03:16:19

标签: python windows powershell

我需要在Windows中获得SAN卷的总空间和已用空间。使用Windows字母装入点在服务器上安装的卷太多。而是服务器软件在C:\ Volumes路径中安装所有可用卷。

wmic logicaldisk get volumename, size, freespace

速度快,效果很好,但它只列出了作为Windows字母挂载的卷。

dir \s \a C:\Volumes\SomeVolumeName

返回我需要的信息,但是当它通过所有文件进行递归时它非常慢。我在每个卷上都有数十万个文件。

du C:\Volumes\SomeVolumeName
由于与dir命令相同的原因,

速度很慢。

还有其他方法可以从Windows命令行获取卷上的快速统计信息,还是从Python中获得更好的数据?

3 个答案:

答案 0 :(得分:1)

我认为您正在寻找psutil

  

psutil(python系统和流程实用程序)是一个跨平台的   用于检索有关正在运行的进程和系统的信息的库   Python中的利用率(CPU,内存,磁盘,网络)。它是有益的   主要用于系统监控,分析和限制流程资源   和运行流程的管理。它实现了许多   命令行工具提供的功能,例如:ps,top,lsof,   netstat,ifconfig,who,df,kill,free,nice,ionice,iostat,iotop,   正常运行时间,pidof,tty,taskset,pmap。它目前支持Linux,   Windows,OSX,Sun Solaris,FreeBSD,OpenBSD和NetBSD,均为32位   和64位体系结构,Python版本从2.6到3.5(用户   Python 2.4和2.5可能使用2.1.3版本)。 PyPy也是众所周知的   工作

https://pythonhosted.org/psutil/

对你而言,特别是文档的这一部分:https://pythonhosted.org/psutil/#disks

答案 1 :(得分:0)

您可以从以下脚本中获取所需的数据。在数组$ DriveLetter中输入系统中的所有卷,执行

并不需要太多时间
$DriveLetter="C,D"
$DriveLetters=$DriveLetter.Split(',')
foreach ($item in $DriveLetters)
{
$data=Get-PSDrive $item | Select-Object Used,Free
$UsedData=$data.Used
$FreeSPace=$data.Free
"Used Space in Drive $item : $UsedData"
"Free space in Drive $item : $FreeSPace"
}

希望它能够发挥作用。

答案 2 :(得分:0)

在此.bat脚本中,您可以捕获GB的卷可用空间并进行比较,可以捕获总容量。 试试这个:

@echo off & setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=2,3,4" %%a in ('echo list volume ^| diskpart') do (
::echo o volume %%b
::fsutil volume diskfree %%b:
set result=E
set size=0
set free=0
FOR /f "tokens=1,2*delims=:" %%i IN ('fsutil volume diskfree %%b:') DO (
::echo Dtotal "%%i"
    if "%%i" == "Total free bytes        " ( 
        FOR /f "tokens=1,2delims=(" %%m in ('echo %%j') do (
            ::echo splittotal %%i : %%n
            FOR /f "tokens=1delims=," %%k in ('echo %%n') do (
                ::echo splittotalGB %%i :%%k
                set free=%%k
            )
        )
        set result=A
    )
    if "%%i" == "Total bytes             " (
        FOR /f "tokens=1,2delims=(" %%m in ('echo %%j') do (
            ::echo splittotal %%i : %%n
            FOR /f "tokens=1delims=," %%k in ('echo %%n') do (
                ::echo splittotalGB %%i :%%k
                set size=%%k
            )
        )
    )
)
if "!result!" == "A" (
    echo result !size!x!free!
    set /a nfree=!free!*1
    set /a min=40
    if !free! lss !min! (
        echo ok
        set MSG=The partition %%b on server_complete_name have only !free! from total !size!
    )
)
)