113

有没有办法在不安装一些第三方应用程序的情况下获得 CMD 中磁盘或文件夹的可用磁盘空间量?

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

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

4

9 回答 9

138

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

编辑: 更好的解决方案:“ fsutil volume diskfree c:

于 2008-11-16T11:09:19.440 回答
57

一个可能的解决方案:

dir|find "bytes free"

一个更“高级的解决方案”,适用于 Windows Xp 及更高版本:

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

Windows Management Instrumentation 命令行(WMIC) 工具 (Wmic.exe) 可以收集有关 Windows Server 2003 以及 Windows XP 或 Vista 的大量信息。该工具使用 Windows Management Instrumentation (WMI) 访问底层硬件。不适用于 Windows 2000。


正如Alexander Stohr 在评论中指出的那样:

  • WMIC 也可以查看基于策略的限制。(即使 ' dir' 仍然可以完成这项工作),
  • ' dir' 取决于语言环境。
于 2008-11-16T11:11:54.553 回答
11

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

于 2019-02-02T15:55:12.307 回答
9

您可以通过在 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 年以来发生了很大变化。这是一个更好的答案。它使用在所有当前支持的 Microsoft Windows 系统上都可用的 PowerShell。

如果脚本是用 PowerShell 编写的,而不使用 cmd.exe 作为包装器,下面的代码会更清晰、更容易理解。如果您使用的是 PowerShell Core,请更改powershellpwsh.

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."
)
于 2013-06-06T23:10:28.737 回答
8

文件

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

您可以从http://www.paulsadowski.com/WSH/cmdprogs.htm、http://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 上的可用空间(如在 Windows 中映射到共享驱动器),可以输入:

M:\>df -h | grep M: | awk '{print $4}'
于 2008-11-16T13:02:52.643 回答
6

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

@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命令的输出,它需要包含 format 的可用空间的最后一行24 Dir(s) 34,071,691,264 bytes free。具体来说:

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

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

于 2011-09-05T07:26:08.690 回答
1

使用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(请参阅用法)

于 2012-02-03T13:47:04.550 回答
1

我做了一个变体以从脚本中生成它:

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

我使用diskpart来获取此信息。

@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)
于 2020-05-04T00:25:15.843 回答
0

cscript 是第三方应用程序吗?我建议尝试Microsoft Scripting,您可以在其中使用编程语言(JScript、VBS)来检查诸如List Available Disk Space 之类的内容。

所有当前的 Windows 版本(包括 2008)都存在脚本基础结构。

于 2008-11-16T11:19:24.740 回答