พื้นที่ว่างในเปลือก CMD


97

มีวิธีรับจำนวนพื้นที่ว่างของดิสก์หรือโฟลเดอร์ใน CMD โดยไม่ต้องติดตั้งแอปพลิเคชันของบุคคลที่สามหรือไม่?

ฉันมี CMD ที่คัดลอกไฟล์ขนาดใหญ่ไปยังไดเร็กทอรีที่กำหนดและแน่นอนสามารถใช้ errorlevel return จากคำสั่ง copy แต่ฉันต้องรอเวลาที่จะคัดลอกไฟล์ (เช่น ... ดิสก์เต็มและการคัดลอกล้มเหลว)

ฉันต้องการทราบก่อนที่จะเริ่มการคัดลอกหากมีความคิดใด ๆ พยายามใช้ยูทิลิตี้ DU.EXE จาก Sysinternals แต่แสดงว่ามีพื้นที่ว่างเท่านั้น


ฉันต้องถือว่า "การติดตั้งของบุคคลที่สาม" แทนที่จะหมายถึง "การติดตั้งซอฟต์แวร์เพิ่มเติมใด ๆ " แง่มุมที่ใช้งานได้จริงไม่จำเป็นต้องให้หรือติดตั้งอะไร วิธีการบนเรือเท่านั้น
Alexander Stohr

คำตอบ:


116

หากคุณเรียกใช้ " dir c:\" บรรทัดสุดท้ายจะทำให้คุณมีเนื้อที่ว่างบนดิสก์

แก้ไข: ทางออกที่ดีกว่า: " fsutil volume diskfree c:"


1
และยังทำงานร่วมกับจุดเชื่อมต่อซึ่งไม่ใช่กรณีของผบ.!
LogicDaemon

2
Dir ทำงานได้ดี แต่โปรดทราบว่าคุณจะต้องสร้างไฟล์จำลองหากไดรฟ์ของคุณว่างเปล่า
มิฉะนั้น

มีวิธีรับจำนวนไบต์ฟรีหรือไม่?
Mina Jacob

นอกจากนี้ยกเว้น root dir dir ..*(หรือdir c:\thing\..*) จะแสดงรายการสั้น ๆ ไม่ว่าจะมีไฟล์เป็นศูนย์หรือหลายไฟล์ในไดเร็กทอรี
azhrei

วิธี fsutil อาจใช้ไม่ได้กับไดรฟ์เสมือนเช่น IMDisk RAM Drive คุณจะได้รับ: ข้อผิดพลาด: ฟังก์ชันไม่ถูกต้อง ยูทิลิตี้ FSUTIL ต้องการโวลุ่ม NTFS ภายใน
user2846246

51

ทางออกที่เป็นไปได้:

dir|find "bytes free"

" โซลูชันขั้นสูง " เพิ่มเติมสำหรับ Windows Xp และอื่น ๆ :

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

เครื่องมือWindows Management Instrumentation Command-line (WMIC) (Wmic.exe) สามารถรวบรวมข้อมูลจำนวนมากเกี่ยวกับ Windows Server 2003 ตลอดจน Windows XP หรือ Vista เครื่องมือนี้เข้าถึงฮาร์ดแวร์พื้นฐานโดยใช้ Windows Management Instrumentation (WMI) ไม่ใช่สำหรับ Windows 2000


ตามที่Alexander Stohr ระบุไว้ในความคิดเห็น :

  • WMIC สามารถดูข้อ จำกัด ตามนโยบายได้เช่นกัน (แม้ว่า ' dir' จะยังคงทำงานอยู่ก็ตาม)
  • ' dir' ขึ้นอยู่กับสถานที่

5
+1 สำหรับ WMI ควรเป็นทางออกเดียวที่มั่นคง การใช้ภาษาเฉพาะ (เพื่อค้นหา) อาจเป็นความคิดที่ไม่ดี :)
Joey

ในการใส่พื้นที่ว่างลงในตัวแปรสามารถใช้สิ่งต่อไปนี้:@FOR /F "tokens=2 delims==" %%S IN ('wmic /NODE:"%COMPUTERNAME%" LogicalDisk Where ^(DriveType^="3" and DeviceID^="%some_folder:~0,2%"^) Get FreeSpace /VALUE') DO @SET freespace=%%S
Davor Josipovic

3
@Pacerier: ฉันคิดว่าฉันจำได้ว่าfsutilต้องการสิทธิ์ของผู้ดูแลระบบเพื่อให้ทำงานได้ไม่ว่าคุณจะทำอะไรกับมันก็ตาม
Joey

1
@ techguy1029 ใช่: superuser.com/a/924992/141หรือsuperuser.com/a/896771/141
VonC

1
@AlexanderStohr จุดดี. ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้มากขึ้น
VonC


7

คุณสามารถหลีกเลี่ยงเครื่องหมายจุลภาคได้โดยใช้ / -C บนคำสั่ง DIR

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%

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 24 Dir(s) 34,071,691,264 bytes freeโดยเฉพาะ:

  • ต้องเป็นบรรทัดสุดท้าย (หรือคุณสามารถแก้ไขforลูปเพื่อตรวจจับบรรทัดอย่างชัดเจนแทนที่จะอาศัยการตั้งค่าbytesfreeสำหรับทุกบรรทัด)
  • พื้นที่ว่างต้องเป็น "คำ" ที่สาม (หรือคุณสามารถเปลี่ยนtokens=บิตเพื่อให้ได้คำอื่น)
  • ตัวคั่นหลายพันตัวคือ,อักขระ (หรือคุณสามารถเปลี่ยนการแทนที่จากคอมมาเป็นอย่างอื่นก็ได้)

ไม่ก่อให้เกิดเนมสเปซสภาพแวดล้อมของคุณโดยตั้งค่าbytesfreeตัวแปรเมื่อออกเท่านั้น หากdirผลลัพธ์ของคุณแตกต่างกัน (เช่นการตั้งค่าตำแหน่งที่ตั้งหรือภาษาที่แตกต่างกัน) คุณจะต้องปรับสคริปต์


6

df.exe

แสดงดิสก์ทั้งหมดของคุณ ความจุรวมใช้และฟรี คุณสามารถปรับเปลี่ยนผลลัพธ์โดยใช้ตัวเลือกบรรทัดคำสั่งต่างๆ

คุณสามารถรับได้จาก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}'

2
คุณรู้ไหมว่าทำไมคุณถึงถูกลดทอนลง? เพราะคุณไม่อ่านคำถามอย่างละเอียด อ่าน: «โดยไม่ต้องติดตั้งแอปพลิเคชันของบุคคลที่สาม» แม้ว่าฉันจะชอบ unxutils เป็นการส่วนตัว แต่ก็ไม่ตอบโจทย์ที่นี่
LogicDaemon

7
ยังคงเป็นคำตอบคุณภาพที่ดีสำหรับผู้ที่มาที่นี่นอกเหนือจาก OP
Peter

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)

note1: คุณอาจพิมพ์อักษรธรรมดา (เช่น x) หรืออาจใช้ x: หรือ x: \ format เป็นอักษรระบุไดรฟ์ในอาร์กิวเมนต์

note2: สคริปต์จะแสดง stderr จาก% chkfile% เฉพาะในกรณีที่ขนาดใหญ่กว่า 0

note3: ฉันบันทึกสคริปต์นี้เป็น freedisk.cmd (ดูการใช้งาน)


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)

0

cscript เป็นแอปของบุคคลที่สามหรือไม่ ฉันขอแนะนำให้ลองใช้ Microsoft Scriptingซึ่งคุณสามารถใช้ภาษาการเขียนโปรแกรม (JScript, VBS) เพื่อตรวจสอบสิ่งต่างๆเช่นList Available Disk SpaceSpace

โครงสร้างพื้นฐานการเขียนสคริปต์มีอยู่ใน Windows เวอร์ชันปัจจุบันทั้งหมด (รวมถึงปี 2008)


1
cscript คือ Microsoft Scripting เป็นเวอร์ชันคอนโซลของตัวแปลสคริปต์ Windows ( wscriptคือเวอร์ชัน GUI)
Synetech

ฉันต้องถือว่า "การติดตั้งของบุคคลที่สาม" แทนที่จะหมายถึง "การติดตั้งซอฟต์แวร์เพิ่มเติมใด ๆ " แง่มุมที่ใช้งานได้จริงไม่จำเป็นต้องให้หรือติดตั้งอะไร วิธีการบนเรือเท่านั้น
Alexander Stohr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.