ไม่มีคำตอบที่โพสต์เมื่อวันที่ 2018-06-01 ยกเว้นบรรทัดคำสั่งเดียวที่โพสต์โดยfoxidriveลบไฟล์ทั้งหมดและโฟลเดอร์ / ไดเรกทอรีทั้งหมดใน%PathToFolder%
จริงๆ นั่นเป็นเหตุผลสำหรับการโพสต์คำตอบมากขึ้นด้วยบรรทัดคำสั่งเดียวง่ายมากที่จะลบไฟล์และโฟลเดอร์ย่อยทั้งหมดของโฟลเดอร์เช่นเดียวกับไฟล์ชุดที่มีวิธีการแก้ปัญหาที่ซับซ้อนมากขึ้นอธิบายว่าทำไมคำตอบอื่น ๆ ทั้งหมดเป็นโพสต์บน 2018/06/01 โดยใช้DELและFORกับRDล้มเหลวในการล้างโฟลเดอร์อย่างสมบูรณ์
โซลูชันบรรทัดคำสั่งเดี่ยวแบบง่ายซึ่งแน่นอนว่าสามารถใช้ในไฟล์แบตช์ได้:
pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )
บรรทัดคำสั่งนี้มีสามคำสั่งดำเนินการหนึ่งหลังจากที่อื่น
คำสั่งแรกPUSHDผลักเส้นทางไดเรกทอรีปัจจุบันบนกองและทำให้ต่อไป%PathToFolder%
ไดเรกทอรีปัจจุบันสำหรับการเรียกใช้กระบวนการคำสั่ง
สิ่งนี้ใช้ได้สำหรับเส้นทางUNCโดยค่าเริ่มต้นเนื่องจากส่วนขยายคำสั่งถูกเปิดใช้งานโดยค่าเริ่มต้นและในกรณีนี้PUSHDจะสร้างตัวอักษรไดรฟ์ชั่วคราวที่ชี้ไปที่ทรัพยากรเครือข่ายที่ระบุนั้นจากนั้นเปลี่ยนไดรฟ์และไดเรกทอรีปัจจุบัน
PUSHDเอาต์พุตข้อความแสดงข้อผิดพลาดต่อไปนี้เพื่อจัดการSTDERRหากไดเร็กทอรีที่ระบุไม่มีอยู่เลย:
ระบบไม่สามารถหาเส้นทางที่ระบุ.
ข้อความแสดงข้อผิดพลาดนี้ถูกระงับโดยการเปลี่ยนเส้นทาง2>nul
ไปยังอุปกรณ์NUL NUL
คำสั่งRDต่อไปจะถูกดำเนินการเฉพาะในกรณีที่การเปลี่ยนไดเรกทอรีปัจจุบันสำหรับกระบวนการคำสั่งปัจจุบันเป็นไดเรกทอรีที่ระบุประสบความสำเร็จนั่นคือไดเรกทอรีที่ระบุมีอยู่ทั้งหมด
คำสั่งRDพร้อมตัวเลือก/Q
และ/S
ลบไดเรกทอรีอย่างเงียบ ๆพร้อมกับไดเรกทอรีย่อยทั้งหมดแม้ว่าไดเรกทอรีที่ระบุจะมีไฟล์หรือโฟลเดอร์ที่มีแอตทริบิวต์ที่ซ่อนอยู่หรือมีชุดแอตทริบิวต์อ่านอย่างเดียว คุณลักษณะของระบบไม่เคยป้องกันการลบไฟล์หรือโฟลเดอร์
ไม่ถูกลบคือ:
โฟลเดอร์ที่ใช้เป็นไดเรกทอรีปัจจุบันสำหรับกระบวนการทำงานใด ๆ แผนผังโฟลเดอร์ทั้งหมดไปยังโฟลเดอร์ดังกล่าวไม่สามารถลบได้หากใช้โฟลเดอร์เป็นไดเรกทอรีปัจจุบันสำหรับกระบวนการทำงานใด ๆ
ไฟล์ที่เปิดอยู่ในปัจจุบันโดยกระบวนการทำงานใด ๆ ที่มีสิทธิ์การเข้าถึงไฟล์ที่กำหนดไว้ในไฟล์ที่เปิดอยู่เพื่อป้องกันการลบไฟล์ในขณะที่เปิดโดยแอปพลิเคชัน / กระบวนการที่กำลังทำงานอยู่ ไฟล์ที่เปิดดังกล่าวจะป้องกันการลบทรีโฟลเดอร์ทั้งหมดไปยังไฟล์ที่เปิดอยู่
ไฟล์ / โฟลเดอร์ที่ผู้ใช้ปัจจุบันไม่มีสิทธิ์ที่จำเป็น (NTFS) ในการลบไฟล์ / โฟลเดอร์ซึ่งป้องกันการลบทรีของโฟลเดอร์ไปยังไฟล์ / โฟลเดอร์นี้
เหตุผลแรกสำหรับการไม่ลบโฟลเดอร์จะถูกใช้โดยบรรทัดคำสั่งนี้เพื่อลบไฟล์และโฟลเดอร์ย่อยทั้งหมดของโฟลเดอร์ที่ระบุ แต่ไม่ใช่โฟลเดอร์ โฟลเดอร์ถูกสร้างเป็นไดเรกทอรีปัจจุบันชั่วคราวสำหรับการเรียกใช้กระบวนการคำสั่งซึ่งป้องกันการลบโฟลเดอร์เอง แน่นอนผลลัพธ์นี้ในผลลัพธ์ของข้อความแสดงข้อผิดพลาดโดยคำสั่งRD :
กระบวนการไม่สามารถเข้าถึงไฟล์ได้เนื่องจากกำลังถูกใช้โดยกระบวนการอื่น
ไฟล์เป็นคำผิดที่นี่เป็นในความเป็นจริงโฟลเดอร์จะถูกใช้โดยกระบวนการอื่นกระบวนการสั่งปัจจุบันซึ่งดำเนินการคำสั่งRD ในความเป็นจริงแล้วโฟลเดอร์สำหรับระบบไฟล์เป็นไฟล์พิเศษที่มีไดเรกทอรีไฟล์คุณลักษณะซึ่งอธิบายถึงข้อความแสดงข้อผิดพลาดนี้ แต่ฉันไม่ต้องการลึกเข้าไปในการจัดการระบบไฟล์
ข้อความผิดพลาดนี้เช่นข้อความผิดพลาดอื่น ๆ ทั้งหมดซึ่งอาจเกิดขึ้นเนื่องจากเหตุผลสามประการที่เขียนข้างต้นจะถูกระงับโดยการเปลี่ยนเส้นทางด้วย2>nul
จากการจับSTDERRไปยังอุปกรณ์NUL
คำสั่งที่สามpopd , จะถูกดำเนินการอย่างเป็นอิสระของมูลค่าทางออกของคำสั่งRD
POPDจะแสดงเส้นทางไดเรกทอรีที่ผลักดันโดยPUSHDจากสแต็กและเปลี่ยนไดเรกทอรีปัจจุบันสำหรับการเรียกใช้กระบวนการคำสั่งไปยังไดเรกทอรีนี้เช่นเรียกคืนไดเรกทอรีปัจจุบันเริ่มต้น POPDลบอักษรระบุไดรฟ์ชั่วคราวที่สร้างโดยPUSHDในกรณีที่เส้นทางโฟลเดอร์ UNC
หมายเหตุ: POPDสามารถล้มเหลวในการกู้คืนไดเร็กทอรีปัจจุบันเริ่มต้นในกรณีที่ไดเรกทอรีปัจจุบันเริ่มต้นเป็นไดเรกทอรีย่อยของไดเรกทอรีเพื่อล้างซึ่งไม่มีอยู่อีกต่อไป ในกรณีพิเศษนี้%PathToFolder%
ยังคงไดเรกทอรีปัจจุบัน ดังนั้นจึงแนะนำให้รันบรรทัดคำสั่งด้านบนไม่ใช่จากไดเรกทอรีย่อยของ%PathToFolder%
ดังนั้นจึงแนะนำให้เรียกใช้บรรทัดคำสั่งดังกล่าวข้างต้นไม่ได้มาจากไดเรกทอรีย่อยของ
ข้อเท็จจริงที่น่าสนใจอีกข้อหนึ่ง:
ฉันลองใช้บรรทัดคำสั่งโดยใช้เส้นทาง UNC ด้วยการแชร์ไดเรกทอรีท้องถิ่นC:\Temp
ด้วยชื่อที่Temp
ใช้ร่วมกันและใช้เส้นทาง UNC ที่\\%COMPUTERNAME%\Temp\CleanTest
กำหนดให้กับตัวแปรสภาพแวดล้อมPathToFolder
ใน Windows 7 หากไดเรกทอรีปัจจุบันในการเรียกใช้บรรทัดคำสั่งเป็นไดเรกทอรีย่อยของท้องถิ่นที่ใช้ร่วมกัน การเข้าถึงโฟลเดอร์โดยใช้เส้นทาง UNC เช่นC:\Temp\CleanTest\Subfolder1
, Subfolder1
จะถูกลบโดยRDและถัดpopdล้มเหลวในการทำเงียบC:\Temp\CleanTest\Subfolder1
อีกครั้งไดเรกทอรีปัจจุบันผลในการไปยังไดเรกทอรีที่มีอยู่ในท้องถิ่นจริงๆ น่าเสียดายที่POPDZ:\CleanTest
ส่วนที่เหลือเป็นไดเรกทอรีปัจจุบันสำหรับกระบวนการทำงานคำสั่ง ดังนั้นในกรณีที่พิเศษมากตัวอักษรไดรฟ์ชั่วคราวจะยังคงอยู่จนกว่าไดเรกทอรีปัจจุบันจะเปลี่ยนไปเช่นcd /D %SystemRoot%
ไม่ออกมีมูลค่ามากขึ้น 0 ถ้ามันล้มเหลวในการเรียกคืนไดเรกทอรีปัจจุบันเริ่มต้นที่ทำให้มันเป็นไปไม่ได้ในการตรวจสอบสภาพของข้อผิดพลาดนี้มากเป็นพิเศษโดยใช้เพียงรหัสทางออกของpopd อย่างไรก็ตามมันอาจจะเป็นไปได้ว่าไม่มีใครที่เคยเจอกรณีข้อผิดพลาดพิเศษนี้เนื่องจากเส้นทางของ UNC มักจะไม่ถูกใช้เพื่อเข้าถึงไฟล์และโฟลเดอร์ในเครื่อง
เพื่อความเข้าใจคำสั่งที่ใช้ดียิ่งขึ้นให้เปิดหน้าต่างพรอมต์คำสั่งดำเนินการคำสั่งต่อไปนี้และอ่านวิธีใช้ที่แสดงสำหรับแต่ละคำสั่งอย่างระมัดระวัง
บรรทัดเดียวที่มีหลายคำสั่งโดยใช้ไฟล์ชุด Windowsอธิบายผู้ประกอบการ&&
และ&
ใช้ที่นี่
ถัดไปให้เรามองในการแก้ปัญหาแฟ้มชุดใช้คำสั่งDELเพื่อลบไฟล์ใน%PathToFolder%
และFORและRD%PathToFolder%
ลบโฟลเดอร์ย่อยใน
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"
rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"
rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder
rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"
rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder
rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
:EndCleanFolder
endlocal
ไฟล์แบตช์แรกตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อมPathToFolder
ถูกกำหนดด้วยพา ธ โฟลเดอร์จริงๆโดยไม่ต้องใส่เครื่องหมายอัญประกาศคู่และไม่มีแบ็กสแลชที่ท้าย แบ็กสแลชที่ท้ายจะไม่เป็นปัญหา แต่เครื่องหมายคำพูดคู่ในเส้นทางโฟลเดอร์อาจเป็นปัญหาได้เนื่องจากค่าของPathToFolder
ถูกต่อกับสตริงอื่น ๆ ระหว่างการดำเนินการแบตช์ไฟล์
สิ่งสำคัญคือสองบรรทัด:
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
คำสั่งDELใช้เพื่อลบไฟล์ทั้งหมดในไดเรกทอรีที่ระบุ
- ตัวเลือกที่
/A
มีความจำเป็นในการดำเนินการจริงๆไฟล์ทั้งหมดรวมถึงไฟล์ที่มีคุณลักษณะที่ซ่อนอยู่ซึ่งDEL/A
จะไม่สนใจโดยไม่ต้องใช้ตัวเลือก
- ตัวเลือก
/F
มีความจำเป็นในการบังคับลบไฟล์ด้วยชุดคุณสมบัติอ่านอย่างเดียว
- ตัวเลือก
/Q
มีความจำเป็นต้องเรียกใช้การลบแบบเงียบ ๆ ของหลาย ๆ ไฟล์โดยไม่แจ้งให้ผู้ใช้ทราบหากควรลบหลาย ๆ ไฟล์
>nul
จำเป็นต้องเปลี่ยนเส้นทางเอาต์พุตของชื่อไฟล์ที่เขียนเพื่อจัดการSTDOUTไปยังอุปกรณ์NULซึ่งไม่สามารถลบได้เนื่องจากไฟล์เปิดอยู่ในขณะนี้หรือผู้ใช้ไม่ได้รับอนุญาตให้ลบไฟล์
2>nul
จำเป็นต้องเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดสำหรับแต่ละไฟล์ที่ไม่สามารถลบออกจากมือจับได้ STDERRไปยังอุปกรณ์NUL
คำสั่งFORและRDใช้เพื่อลบไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีที่ระบุ แต่for /D
ไม่ได้ใช้เนื่องจากFORจะข้ามไปในไดเรกทอรีย่อยกรณีนี้ด้วยชุดแอตทริบิวต์ที่ซ่อนอยู่ ด้วยเหตุผลนั้นfor /F
กล่าวจะใช้เพื่อเรียกใช้บรรทัดคำสั่งต่อไปนี้ในกระบวนการคำสั่งแยกต่างหากที่เริ่มต้นในพื้นหลังด้วย%ComSpec% /c
:
dir "%PathToFolder%\*" /AD /B 2>nul
DIRแสดงผลในรูปแบบเปล่าเนื่องจาก/B
รายการไดเรกทอรีที่มีคุณสมบัติD
เช่นชื่อของไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีที่ระบุเป็นอิสระในคุณลักษณะอื่น ๆ เช่นคุณลักษณะที่ซ่อนอยู่โดยไม่มีเส้นทาง 2>nul
ถูกใช้เพื่อเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดโดยDIRบนไม่พบไดเรกทอรีจากหมายเลขอ้างอิง STDERRไปยังอุปกรณ์NUL
ผู้ประกอบการเปลี่ยนเส้นทาง>
จะต้องหลบหนีด้วยตัวอักษรเครื่องหมายตก^
บนบรรทัดคำสั่งFORที่จะตีความว่าเป็นตัวอักษรเมื่อล่ามคำสั่งของ Windows ประมวลผลบรรทัดคำสั่งนี้ก่อนที่จะดำเนินการคำสั่งสำหรับที่รันฝังdir
บรรทัดคำสั่งในขั้นตอนการสั่งแยกต่างหากเริ่มต้น ในพื้นหลัง.
สำหรับกระบวนการเอาต์พุตที่ดักจับถูกเขียนเพื่อจัดการSTDOUTของกระบวนการคำสั่งที่เริ่มต้นซึ่งเป็นชื่อของไดเร็กทอรีย่อยที่ไม่มีพา ธ และไม่เคยใส่ในเครื่องหมายคำพูดคู่
FOR ที่มีตัวเลือก/F
จะละเว้นบรรทัดว่างที่ไม่ได้เกิดขึ้นที่นี่เป็น DIRพร้อมตัวเลือก/B
จะไม่ส่งออกบรรทัดว่าง
สำหรับจะละเว้นบรรทัดที่ขึ้นต้นด้วยเครื่องหมายอัฒภาคซึ่งเป็นจุดสิ้นสุดเริ่มต้นของอักขระบรรทัด ชื่อไดเรกทอรีสามารถเริ่มต้นด้วยเครื่องหมายอัฒภาค ด้วยเหตุeol=|
นี้จึงใช้เพื่อกำหนดอักขระแถบแนวตั้งเป็นอักขระสิ้นสุดบรรทัดซึ่งไม่มีไดเร็กทอรีหรือไฟล์ในชื่อ
เพื่อจะแยกสายเข้าสตริงโดยใช้พื้นที่และแท็บแนวนอนเป็นตัวคั่นและจะกำหนดเฉพาะพื้นที่แรก / I
แท็บสตริงคั่นตัวแปรห่วงระบุ พฤติกรรมการแยกนี้ไม่ต้องการที่นี่เพราะชื่อไดเรกทอรีสามารถมีช่องว่างอย่างน้อยหนึ่งช่องว่าง ดังนั้นdelims=
จะใช้เพื่อกำหนดรายการว่างของตัวคั่นเพื่อปิดใช้งานลักษณะการแบ่งบรรทัดและได้รับมอบหมายให้กับตัวแปรลูปI
เสมอชื่อไดเรกทอรีที่สมบูรณ์
คำสั่งสำหรับรันคำสั่งRDสำหรับแต่ละชื่อไดเรกทอรีโดยไม่มีพา ธ ซึ่งเป็นเหตุผลว่าทำไมบนบรรทัดคำสั่งRDต้องระบุพา ธ โฟลเดอร์อีกครั้งซึ่งเชื่อมต่อกับชื่อโฟลเดอร์ย่อย
เพื่อทำความเข้าใจคำสั่งที่ใช้และวิธีการทำงานให้เปิดหน้าต่างพรอมต์คำสั่งดำเนินการคำสั่งต่อไปนี้และอ่านหน้าวิธีใช้ทั้งหมดที่แสดงสำหรับแต่ละคำสั่งอย่างระมัดระวัง
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
rd /?
rem /?
set /?
setlocal /?