Batch file 如何使用批处理文件获取可用硬盘空间?

Batch file 如何使用批处理文件获取可用硬盘空间?,batch-file,Batch File,我试图获得免费的硬盘空间使用批处理文件。它返回以字节为单位的空间,但我需要以GB为单位的空间。 我尝试了转换,但批处理中存在一些限制,不允许对非常大的数量进行操作 这是我的剧本 for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set freeSpace=%%S echo %freeSpace% 我还试图消除最后9位(GB),但这是非常不准确的。例如如果可用空间为18

我试图获得免费的硬盘空间使用批处理文件。它返回以字节为单位的空间,但我需要以GB为单位的空间。 我尝试了转换,但批处理中存在一些限制,不允许对非常大的数量进行操作

这是我的剧本

for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set freeSpace=%%S
echo %freeSpace%
我还试图消除最后9位(GB),但这是非常不准确的。例如如果可用空间为180 GB,则显示为200 GB


我还有别的办法吗?

好吧,让我们这样说吧。你已经决定把所有的虫子都放回罐子里,好吗

在商业上,制造商更喜欢以千兆字节表示大小,为此,他们援引SI(Systeme International)的权威,并使用10**9的系数

计算机行业使用2的幂,因此SI引入了众所周知的术语Gigibyte(或者我得到可靠消息),意思是2**30

(SI还想让你提到“10公斤”或“10米”,而不是“10公斤”或“10米”。是的,这是一项只有术语火鸡才严格遵守的指令)

对于制造商来说是千兆字节,因为这个数字更大,因此比行业中使用的千兆字节数字要好

所有这些当然都超出了老板的副手长腿小姐的经验和理解范围,她会毫不含糊地告诉你,她有200Gb,而不是180 GB——所以你是荣

尽管使用Gigibytes是合乎逻辑的,但你实际上是在推动这一谚语,让那些自称为“专家”的人了解它——甚至大多数内部人士也不知道“官方”术语。他们的措辞让人听不见区别,如果你写了,那么很少有人知道正确的术语(但很多人相信他们知道),你只会被视为一个斯佩拉

但是-如果您真的非常想使用2**30定义:


批处理限制为2**31,因此您必须使用另一个工具(可能从批处理中调用以使其正常工作),或者如果您坚持使用纯批处理,请使用长除法手动设计子字符串和重复减法来执行除法。

好吧,让我们这样说。你已经决定把所有的虫子都放回罐子里,好吗

在商业上,制造商更喜欢以千兆字节表示大小,为此,他们援引SI(Systeme International)的权威,并使用10**9的系数

计算机行业使用2的幂,因此SI引入了众所周知的术语Gigibyte(或者我得到可靠消息),意思是2**30

(SI还想让你提到“10公斤”或“10米”,而不是“10公斤”或“10米”。是的,这是一项只有术语火鸡才严格遵守的指令)

对于制造商来说是千兆字节,因为这个数字更大,因此比行业中使用的千兆字节数字要好

所有这些当然都超出了老板的副手长腿小姐的经验和理解范围,她会毫不含糊地告诉你,她有200Gb,而不是180 GB——所以你是荣

尽管使用Gigibytes是合乎逻辑的,但你实际上是在推动这一谚语,让那些自称为“专家”的人了解它——甚至大多数内部人士也不知道“官方”术语。他们的措辞让人听不见区别,如果你写了,那么很少有人知道正确的术语(但很多人相信他们知道),你只会被视为一个斯佩拉

但是-如果您真的非常想使用2**30定义:


批处理限制为2**31,因此您必须使用另一个工具(可能从批处理中调用以使其正常工作),或者如果您坚持使用纯批处理,请使用长除法手动设计子字符串和重复减法来执行除法。

好吧,让我们这样说。你已经决定把所有的虫子都放回罐子里,好吗

在商业上,制造商更喜欢以千兆字节表示大小,为此,他们援引SI(Systeme International)的权威,并使用10**9的系数

计算机行业使用2的幂,因此SI引入了众所周知的术语Gigibyte(或者我得到可靠消息),意思是2**30

(SI还想让你提到“10公斤”或“10米”,而不是“10公斤”或“10米”。是的,这是一项只有术语火鸡才严格遵守的指令)

对于制造商来说是千兆字节,因为这个数字更大,因此比行业中使用的千兆字节数字要好

所有这些当然都超出了老板的副手长腿小姐的经验和理解范围,她会毫不含糊地告诉你,她有200Gb,而不是180 GB——所以你是荣

尽管使用Gigibytes是合乎逻辑的,但你实际上是在推动这一谚语,让那些自称为“专家”的人了解它——甚至大多数内部人士也不知道“官方”术语。他们的措辞让人听不见区别,如果你写了,那么很少有人知道正确的术语(但很多人相信他们知道),你只会被视为一个斯佩拉

但是-如果您真的非常想使用2**30定义:


批处理限制为2**31,因此您必须使用另一个工具(可能从批处理中调用以使其正常工作),或者如果您坚持使用纯批处理,请使用长除法手动设计子字符串和重复减法来执行除法。

好吧,让我们这样说。你已经决定把所有的虫子都放回罐子里,好吗

在商业上,制造商更喜欢以千兆字节表示大小,为此,他们援引SI(Systeme International)的权威,并使用因子o
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="utf-16" omit-xml-declaration ="yes"/>
<xsl:template match="/" xml:space="preserve"><xsl:apply-templates select="//INSTANCE"/></xsl:template>
<xsl:template match="INSTANCE" xml:space="preserve"><xsl:apply-templates select="PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE"/></xsl:template>
<xsl:template match="PROPERTY" xml:space="preserve"><xsl:value-of select="@NAME"/>=<xsl:apply-templates select="VALUE"><xsl:with-param name="type"><xsl:value-of select="@TYPE"/></xsl:with-param><xsl:with-param name="name"><xsl:value-of select="@NAME"/></xsl:with-param></xsl:apply-templates>
</xsl:template>
<xsl:template match="PROPERTY.ARRAY" xml:space="preserve"><xsl:value-of select="@NAME"/>=<xsl:apply-templates select="VALUE.ARRAY"><xsl:with-param name="includequotes">true</xsl:with-param><xsl:with-param name="type"><xsl:value-of select="@TYPE"/></xsl:with-param></xsl:apply-templates></xsl:template>
<xsl:template match="PROPERTY.REFERENCE" xml:space="preserve"><xsl:value-of select="@NAME"/>=<xsl:apply-templates select="VALUE.REFERENCE"></xsl:apply-templates></xsl:template>
<xsl:template match="VALUE.REFERENCE">"<xsl:apply-templates select="INSTANCEPATH/NAMESPACEPATH"/><xsl:apply-templates select="INSTANCEPATH/INSTANCENAME|INSTANCENAME"/>"</xsl:template>
<xsl:template match="NAMESPACEPATH">\\<xsl:value-of select="HOST/text()"/><xsl:for-each select="LOCALNAMESPACEPATH/NAMESPACE">\<xsl:value-of select="@NAME"/></xsl:for-each>:</xsl:template>
<xsl:template match="INSTANCENAME"><xsl:value-of select="@CLASSNAME"/><xsl:for-each select="KEYBINDING"><xsl:if test="position()=1">.</xsl:if><xsl:value-of select="@NAME"/>="<xsl:value-of select="KEYVALUE/text()"/>"<xsl:if test="position()!=last()">,</xsl:if></xsl:for-each></xsl:template>
<xsl:template match="VALUE.ARRAY"><xsl:param name="type"/>{<xsl:for-each select="VALUE">
        <xsl:apply-templates select=".">
            <xsl:with-param name="type">
                <xsl:value-of select="$type"/>
            </xsl:with-param>
            <xsl:with-param name="includequotes">true</xsl:with-param>
        </xsl:apply-templates>
        <xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>}</xsl:template>
<xsl:template match="VALUE">
    <xsl:param name="type"/>
    <xsl:param name="name"/>
    <xsl:param name="includequotes"/>
    <xsl:choose>
        <xsl:when test="$type='string'">
            <xsl:if test="$includequotes='true'">"</xsl:if><xsl:value-of select="."/><xsl:if test="$includequotes='true'">"</xsl:if>
        </xsl:when>
        <xsl:when test="$type='char16'">
            '<xsl:value-of select="."/>'
        </xsl:when>
        <xsl:when test="$type='uint64' and $name='FreeSpace'">
            <xsl:value-of select="format-number(. div 1073741824,'#0.00')"/>GB
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="."/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>
wmic volume where "driveLetter='c:'" get capacity,freespace /format:"c:\pathTo\myFormat.xsl"
Capacity=241173401600
FreeSpace=153.61GB
@echo off
setlocal enabledelayedexpansion

set wmi=WMIC LogicalDisk Where DriveType='3' Get DeviceID,FreeSpace,Size^|Find ":"
for /f "tokens=1,3,4" %%a in ('"%wmi%"') do (
   call :GetUnit %%b ufree
   call :Convertbytes %%b !ufree! free
   call :GetUnit %%c usize
   call :Convertbytes %%c !usize! size
   Echo %%a Free space: !free! !ufree! of !size! !usize!
)

exit /b

:ConvertBytes bytes unit ret
setlocal
if "%~2" EQU "KB" set val=/1024
if "%~2" EQU "MB" set val=/1024/1024
if "%~2" EQU "GB" set val=/1024/1024/1024
if "%~2" EQU "TB" set val=/1024/1024/1024/1024
> %temp%\tmp.vbs echo wsh.echo FormatNumber(eval(%~1%val%),0)
for /f "delims=" %%a in ( 
  'cscript //nologo %temp%\tmp.vbs' 
) do endlocal & set %~3=%%a
del %temp%\tmp.vbs
exit /b

:GetUnit bytes return
set byt=00000000000%1X
set TB=000000000001099511627776X
if %1 LEQ 1024 set "unit=Bytes"
if %1 GTR 1024   set "unit=KB"
if %1 GTR 1048576  set "unit=MB"
if %1 GTR 1073741824  set "unit=GB"
if %byt:~-14% GTR %TB:~-14% set "unit=TB"
endlocal & set %~2=%unit%
exit /b
WScript.Echo Round(Eval(WScript.Arguments(0)), WScript.Arguments(1))
@echo off

setlocal ENABLEDELAYEDEXPANSION

for /f "tokens=2 delims=:" %%i in ('fsutil volume diskfree c: ^| find /i "of free"') do set _free=%%i
for /f %%i in ('cscript //nologo eval.vbs "!_free!/1024/1024/1024" 2') do set _free=%%i
echo The C: drive has !_free! GB free

endlocal
The C: drive has 45.26 GB free
@echo off

    call :reduceStorage 241173401600  value
    echo %value%

    call :reduceStorage 1024 value
    echo %value%

    exit /b

rem --------------------------------------------------------------------
rem Reduce input number by dividing it by 1024 as many times as needed

:reduceStorage size resultVar
    setlocal
    set "size=%~1"
    set "u="
    for %%u in (K M G T P E Z Y) do if not "!size:~5,1!"=="" (
            call :divide "!size!" 1024 size
            set "u=%%u"
    )
    endlocal & set "%~2=%size% %u%B"
    goto :EOF

rem --------------------------------------------------------------------
rem Divide a large number by a small (2E31) number
:divide number div resultVar
    setlocal
    set "num=%~1"
    set "d=%~2"
    set "a="
    call :length "%num%" len
    for /l %%l in (0 1 %len%) do (
        if defined num (
            set "a=!a!!num:~0,1!"
            set "num=!num:~1!"
            if !a! lss %d% (
                if defined res set "res=!res!0"
            ) else (
                set /a "r=!a!/%d%"
                set "res=!res!!r!"
                set /a "b=!a!-(%d%*!r!)"
                if !b! gtr 0 (
                    set "a=!b!"
                ) else (
                    set "a="
                )
            )
        )
    )

    endlocal & set "%~3=%res%"
    goto :EOF

rem --------------------------------------------------------------------
rem return the length in characters of a variable
:length string returnValue
    setlocal enableextensions enabledelayedexpansion
    set "p=16384"
    set "s=%~1"
    for %%i in ( 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1 ) do (
        for %%j in (!p!) do if "!s:~%%j,1!"=="" ( set /a "p-=%%i" ) else ( set /a "p+=%%i" )
    )
    if not "!string:~%p%,1!"=="" set /a p+=1
    endlocal & set "%~2=%p%"
    goto :EOF