我需要一个bat文件来获取Windows系统中C:\驱动器的总空间和可用空间(以GB(千兆字节)为单位),并创建一个包含详细信息的文本文件。使用任何外部实用程序。

评论

我看不到编程问题(与此有关的任何问题)。即使您改写一个适当的编程问题,也无法使用本机批处理解决方案,因为本机批处理无法对您今天在磁盘驱动器中看到的大量数字进行数学运算。纯本地批处理可以提供免费字节,但不能提供免费GB。

所谓“外部实用程序”,是指您只想使用Windows附带的功能(版本?,7?),例如fsutil,wmic等?那么PowerShell或VBScript呢?它们随Windows一起提供。

#1 楼

将字节大小切成9位数字以得到GB大小:
>

评论


在我的Win7机器上,数字后没有多余的空格或其他字符,因此长度应为-9,而不是-10。同样,这仅近似于GB。我认为您知道这一点,但您的回答可能会误导某些人。

– dbenham
13年6月23日,0:52

输出取决于本地/区域设置(例如robocopy),我现在将其更改为更“美国风格”。 GB值在数学上不正确,可能会变化+/- 1GB,对于小体积而言更重要。

– Endoro
2013年6月23日4:58在

您可以再添加一个带有delims = space的FOR / F循环,以从值中去除前导和尾随空格。然后,您的答案不受区域设置的影响。

– dbenham
13年6月23日在5:15

我不知道为什么我假设结尾字符是空格:/?

– dbenham
2013年6月23日5:52

如果永远不会有多余的尾随字符,而与语言环境无关,则长度肯定应为-9。您编辑的代码肯定是错误的。附加的FOR / F应该为%var:〜0,-9%,否则为%var:〜1,-9%。我认为各个地区的领导空间是不变的。

– dbenham
2013年6月23日12:47



#2 楼

无论如何,这都不是一个完整的解决方案,但是有人可能会发现这很有帮助:

dir | find "bytes"


#3 楼

这可能根本不是您想要的,因为它使用了PowerShell,但是“外部实用程序”有点模糊,给我留下了些许回旋的余地。另外,它本质上是单线的。

SETLOCAL

FOR /F "usebackq tokens=1,2" %%f IN (`PowerShell -NoProfile -EncodedCommand "CgBnAHcAbQBpACAAVwBpAG4AMwAyAF8ATABvAGcAaQBjAGEAbABEAGkAcwBrACAALQBGAGkAbAB0AGUAcgAgACIAQwBhAHAAdABpAG8AbgA9ACcAQwA6ACcAIgB8ACUAewAkAGcAPQAxADAANwAzADcANAAxADgAMgA0ADsAWwBpAG4AdABdACQAZgA9ACgAJABfAC4ARgByAGUAZQBTAHAAYQBjAGUALwAkAGcAKQA7AFsAaQBuAHQAXQAkAHQAPQAoACQAXwAuAFMAaQB6AGUALwAkAGcAKQA7AFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAoACQAdAAtACQAZgApACwAJABmAH0ACgA="`) DO ((SET U=%%f)&(SET F=%%g))

@ECHO Used: %U%
@ECHO Free: %F%


由于批处理/ CMD几乎对所有方面都不利,所以我决定使用PowerShell,它适用于此类东西并且具有快速简便地访问WMI。

这是PowerShell代码:

Get-WMIObject -Query "SELECT * FROM Win32_LogicalDisk WHERE Caption='C:'" `
  | % { 
      $f = [System.Math]::Round($_.FreeSpace/1024/1024/1024,1);
      $t = [System.Math]::Round($_.Size/1024/1024/1024,1);
      Write-Host ('' + ($t-$f) + ',' + $f);
  }


这会吐出两个用逗号分隔的值。现在,如果我们只能在FOR循环中做到这一点!

PowerShell具有很好的能力来接受Base64编码的命令(从而避免了转义和使代码难以阅读的需要),因此我们要做的就是尽可能地缩小此命令(以减小编码字符串的大小,严格来说,这是很好的做法,并非绝对必要)。我还将大小减小为整数,然后将它们取整。它至少比舍弃低位十进制数字要近。

缩小编码的命令并在PowerShell中对其进行编码如下所示: >(有关更多详细信息,请参阅PowerShell /?。)

我希望它可以在现有的任何Win7或Win8计算机上运行。 PoSH代码不依赖任何高级功能(除了EncodedCommand位),因此,如果将PoSH安装在XP或Vista计算机上,则很有可能会运行。我无法谈论MS通过Windows Update推送PoSH的历史,但我认为这很有可能会普遍存在。

#4 楼

这应该可以批量工作:

for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set space=%%S
echo %space%