Batch file 如何使用批处理文件获取可用硬盘空间?
我试图获得免费的硬盘空间使用批处理文件。它返回以字节为单位的空间,但我需要以GB为单位的空间。 我尝试了转换,但批处理中存在一些限制,不允许对非常大的数量进行操作 这是我的剧本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
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