CMD shell 中的自由空间

是否有一种方法可以获得 CMD 中磁盘或文件夹的空闲磁盘空间量 而不必安装一些第三方应用程序?

我有一个 CMD,它将一个大文件复制到一个给定的目录,当然可以使用 从 copy 命令返回错误级别,但是之后我必须等待时间 它需要复制文件(例如,到那时磁盘已满,复制操作失败)。

在我开始复印之前,我想知道是否有任何想法。尝试了 Sysinternals 的 DU.EXE 实用程序,但那个显示器只占用了空间。

414453 次浏览

如果您运行“ dir c:\”,最后一行将为您提供空闲磁盘空间。

编辑: 更好的解决办法: “ fsutil volume diskfree c:

一个可能的解决办法:

dir|find "bytes free"

一个更为“ 先进的解决方案”的操作系统,适用于 Windows Xp 及其他操作系统:

wmic /node:"%COMPUTERNAME%" LogicalDisk Where DriveType="3" Get DeviceID,FreeSpace|find /I "c:"

Windows 管理规范命令行(WMIC)工具(WMIC.exe) 可以收集有关 WindowsServer2003以及 WindowsXP 或 Vista 的大量信息。该工具通过使用 Windows 管理规范(WMI)访问底层硬件。不适用于 Windows2000。


正如 亚历山大 · 斯托尔 在评论中指出的:

  • WMIC 也可以看到基于策略的限制(即使‘ dir’仍然可以完成这项工作) ,
  • dir”是依赖于地区的。

Cscript 是第三方应用程序吗? 我建议尝试使用 微软脚本,在这里您可以使用编程语言(JScript,VBS)来检查诸如 列出可用磁盘空间之类的东西。

所有当前 Windows 版本(包括2008年)都提供了脚本基础结构。

Df.exe

显示所有磁盘; 总容量、已用容量和空闲容量。您可以通过各种命令行选项更改输出。

你可以从 http://www.paulsadowski.com/WSH/cmdprogs.htmhttp://unxutils.sourceforge.net/或其他地方得到它。它是一个标准的 unix-util 像 du。

df -h将显示您的驱动器的所有已用和可用磁盘空间。例如:

M:\>df -h
Filesystem      Size  Used Avail Use% Mounted on
C:/cygwin/bin   932G   78G  855G   9% /usr/bin
C:/cygwin/lib   932G   78G  855G   9% /usr/lib
C:/cygwin       932G   78G  855G   9% /
C:              932G   78G  855G   9% /cygdrive/c
E:              1.9T  1.3T  621G  67% /cygdrive/e
F:              1.9T  201G  1.7T  11% /cygdrive/f
H:              1.5T  524G  938G  36% /cygdrive/h
M:              1.5T  524G  938G  36% /cygdrive/m
P:               98G   67G   31G  69% /cygdrive/p
R:               98G   14G   84G  15% /cygdrive/r

Cygwin 可以从以下 https://www.Cygwin.com/免费获得: 它为命令提示符添加了许多强大的工具。要获得驱动器 M 上的可用空间(如在窗口中映射到共享驱动器) ,可以输入:

M:\>df -h | grep M: | awk '{print $4}'

下面的脚本将为您提供驱动器上的空闲字节:

@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=3" %%a in ('dir c:\') do (
set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
echo %bytesfree%
endlocal && set bytesfree=%bytesfree%

注意,这取决于 dir命令的输出,它需要包含格式为 24 Dir(s) 34,071,691,264 bytes free的可用空间的最后一行。具体来说:

  • 它必须是最后一行(或者您可以修改 for循环来显式地检测该行,而不是依赖于为每一行设置 bytesfree)。
  • 可用空间必须是第三个“单词”(或者你可以改变 tokens=位得到一个不同的单词)。
  • 数千个分隔符是 ,字符(或者您可以将逗号替换为其他字符)。

它不会污染您的环境名称空间,只在退出时设置 bytesfree变量。如果您的 dir输出不同(例如,不同的地区或语言设置) ,您将需要调整脚本。

使用 PaxDiablo优秀的解决方案,我写了一个更复杂的批处理脚本,它使用驱动器字母作为输入参数,并检查驱动器是否存在一个棘手(但不美观)的方式:

@echo off
setlocal enableextensions enabledelayedexpansion
set chkfile=drivechk.tmp
if "%1" == "" goto :usage
set drive=%1
set drive=%drive:\=%
set drive=%drive::=%
dir %drive%:>nul 2>%chkfile%
for %%? in (%chkfile%) do (
set chksize=%%~z?
)
if %chksize% neq 0 (
more %chkfile%
del %chkfile%
goto :eof
)
del %chkfile%
for /f "tokens=3" %%a in ('dir %drive%:\') do (
set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
echo %bytesfree% byte(s) free on volume %drive%:
endlocal


goto :eof
:usage
echo.
echo   usage: freedisk ^<driveletter^> (eg.: freedisk c)

注1: 您可以输入简单的字母(例如 x) ,或者可以使用 x: 或 x: 格式作为驱动器字母的参数

注2: 脚本只在大小大于0时显示% chkfile% 中的 stderr

注3: 我将这个脚本保存为 freedisk.cmd (参见用法)

可以通过在 DIR 命令中使用/-C 来避免使用逗号。

FOR /F "usebackq tokens=3" %%s IN (`DIR C:\ /-C /-O /W`) DO (
SET FREE_SPACE=%%s
)
ECHO FREE_SPACE is %FREE_SPACE%

如果希望将可用空间与所需空间进行比较,可以执行以下操作。我指定的数字与数千分隔符,然后删除他们。没有逗号很难理解这个数字。SET/A 很好,但是它不能处理大数据。

SET EXITCODE=0
SET NEEDED=100,000,000
SET NEEDED=%NEEDED:,=%


IF %FREE_SPACE% LSS %NEEDED% (
ECHO Not enough.
SET EXITCODE=1
)
EXIT /B %EXITCODE%

更新:

自2014年以来,情况发生了很大变化。这里有一个更好的答案。它使用 PowerShell,该软件可用于所有当前支持的 MicrosoftWindows 系统。

如果脚本是用 PowerShell 编写的,而不使用 cmd.exe 作为包装器,那么下面的代码将更加清晰和容易理解。如果使用 PowerShell Core,请将 powershell更改为 pwsh

SET "NEEDED=100,000,000"
SET "NEEDED=%NEEDED:,=%"


powershell -NoLogo -NoProfile -Command ^
$Free = (Get-PSDrive -Name 'C').Free; ^
if ($Free -lt [int64]%NEEDED%) { exit $true } else { exit $false }
IF ERRORLEVEL 1 (
ECHO "Not enough disk space available."
) else (
ECHO "Available disk space is adequate."
)

使用这个命令,您可以找到所有分区,大小和可用空间: wmic logicaldisk get size, freespace, caption

我根据脚本做了一个变化:

volume C: - 49 GB total space / 29512314880 byte(s) free

我使用 飞碟来获得这些信息。

@echo off
setlocal enableextensions enabledelayedexpansion
set chkfile=drivechk.tmp
if "%1" == "" goto :usage
set drive=%1
set drive=%drive:\=%
set drive=%drive::=%
dir %drive%:>nul 2>%chkfile%
for %%? in (%chkfile%) do (
set chksize=%%~z?
)
if %chksize% neq 0 (
more %chkfile%
del %chkfile%
goto :eof
)
del %chkfile%
echo list volume | diskpart | find /I " %drive% " >%chkfile%
for /f "tokens=6" %%a in ('type %chkfile%' ) do (
set dsksz=%%a
)
for /f "tokens=7" %%a in ('type %chkfile%' ) do (
set dskunit=%%a
)
del %chkfile%
for /f "tokens=3" %%a in ('dir %drive%:\') do (
set bytesfree=%%a
)
set bytesfree=%bytesfree:,=%
echo volume %drive%: - %dsksz% %dskunit% total space / %bytesfree% byte(s) free
endlocal


goto :eof
:usage
echo.
echo   usage: freedisk ^<driveletter^> (eg.: freedisk c)