มีวิธีการแบทช์ไฟล์เปลี่ยนชื่อเป็นตัวพิมพ์เล็ก?


63

ฉันต้องการวิธีเปลี่ยนชื่อไฟล์ทั้งหมดในโฟลเดอร์และโฟลเดอร์ย่อยเป็นตัวพิมพ์เล็ก

ฉันต้องการทราบว่ามีวิธีการทำเช่นนั้นโดยใช้เฉพาะ windows (XP หรือ 7)


หน้าต่างไม่ได้แยกความแตกต่างระหว่างตัวพิมพ์ใหญ่และเล็กเหมือนกับยูนิกซ์ บางทีถ้าคุณพูดว่าทำไมคุณต้องการสิ่งนี้มันจะช่วยในการแก้ปัญหา
โกง

1
@Idigas ขออภัยเนื่องจากระบบไฟล์ NTFS ชื่อไฟล์นั้นเล็กและใหญ่ ดูsupport.microsoft.com/kb/100625
DaveParillo

ดีเพียง. รับแนวคิดที่ไม่ดีและเผยแพร่ต่อไป ฝันร้ายที่สนับสนุนเมื่อมีคนส่งไฟล์และข้อผิดพลาดนิ้วอ้วนหมายความว่าพวกเขาส่ง "Answers.dat" และกระบวนการที่เข้ามาคาดหวังว่า "answers.dat" ไม่มีเหตุผลที่ดีที่ชื่อทั้งสองจะถูกพิจารณาว่า 'แตกต่างกัน'
David

2
@David ตัวอย่างเช่น Java ต้องการชื่อไฟล์ที่คำนึงถึงขนาดตัวพิมพ์ ที่สามารถสร้างปัญหาจำนวนมากในระบบไฟล์ที่ไม่สนใจขนาดตัวพิมพ์
Arjan

10
ฉันรู้ว่านี่เก่า แต่ฉันต้องการชี้แจงความเข้าใจผิดที่นี่ ในขณะที่ระบบไฟล์ NTFS รองรับขนาดตัวพิมพ์เล็กใหญ่ Windows OS ก็ไม่ได้แยกความแตกต่าง!
ภูมิศาสตร์

คำตอบ:


122

ไปที่ไดเรกทอรีและเรียกใช้คำสั่งต่อไปนี้:

for /f "Tokens=*" %f in ('dir /l/b/a-d') do (rename "%f" "%f")

นี่คือรายละเอียดในกรณีที่มีคนต้องการแก้ไข / ปรับปรุง:

  • for /f - สำหรับทุกบรรทัด
  • "Tokens=*" - ประมวลผลแต่ละรายการในทุกบรรทัด
  • %f in (...)- %fเป็นชื่อตัวแปรของคุณสำหรับทุกรายการ
  • dir - แสดงรายการทุกไฟล์และไดเรกทอรีย่อยในไดเรกทอรี
  • /l- (พารามิเตอร์สำหรับ dir)ใช้ตัวพิมพ์เล็ก
  • /b- (พารามิเตอร์สำหรับ dir)ใช้รูปแบบเปล่าเฉพาะชื่อไฟล์ / ไดเรกทอรีไม่มีขนาดไม่มีส่วนหัว
  • /a-d- (พารามิเตอร์ dir)ไม่ได้แสดงรายการไดเรกทอรี ( aย่อมาจากattribute, -ย่อมาnotและdย่อมาdirectory )
  • rename "%f" "%f"- เปลี่ยนชื่อไฟล์ด้วยชื่อของตัวเองซึ่งจริง ๆ แล้วลดระดับโดยdirคำสั่งและ/lชุดค่าผสม

7
เวอร์ชันที่เรียกซ้ำ: for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (rename "%f" "%f")(เพิ่ม / r ไปยัง dir)
Sawny

3
นี่ช่างโหดร้าย
Shir Gans

4
เวอร์ชันเรียกซ้ำไม่ทำงานสำหรับฉัน - เปลี่ยนชื่อบ่นเรื่องคำสั่งที่อยู่ในรูปแบบที่ไม่ถูกต้อง ปรากฎว่า / s ทำให้ไฟล์ที่สองถูกแสดงเป็นพา ธ สัมบูรณ์และใช้การขยายชื่อไฟล์ (% ~ nxf) ให้ชื่อไฟล์ตัวพิมพ์ใหญ่ตัวแรก ลงเอยด้วยการเรียกซ้ำด้วยตนเอง
Dogmatixed

3
นี่เป็นคำตอบที่ดีมาก ถึงจุดที่ไม่จำเป็นต้องใช้โปรแกรมภายนอกดีและคำสั่งขนาดเล็กไม่จำเป็นต้องแบทช์ไฟล์ซับซ้อน
Jeff Wilbert

2
สามารถแก้ไขเพื่อเปลี่ยนตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่ได้หรือไม่
Chucky

18

spacetornado Renamerเป็นโปรแกรม Windows ที่เปลี่ยนชื่อไฟล์จำนวนมากเป็นชุด คุณสามารถค้นหาและแทนที่ข้อความลบจำนวนอักขระเปลี่ยนตัวพิมพ์เล็กหรือใหญ่และเพิ่มข้อความไปยังจุดเริ่มต้นหรือสิ้นสุด (ต่อท้าย / เสริม) ของชื่อไฟล์ทุกชื่อ

ป้อนคำอธิบายรูปภาพที่นี่


1
กรุณาให้เหตุผลฉันสำหรับการลงคะแนนหรือไม่
joe

5
คนไม่ค่อยอธิบายโชคไม่ดี: /
Gnoupi

7
ฉันเดาว่า downvote นั้นเป็นเพราะ OP ต้องการโซลูชันที่ทำงานโดยไม่มีซอฟต์แวร์เพิ่มเติม และฉันคิดว่า downvote ไม่ได้อธิบายเพราะบางคนมีแนวโน้มที่จะจัดการกับ downvote แก้แค้น
innaM

GUI นั้นขี้ขลาดนิดหน่อย แต่มันทำงานได้ดีกว่า renamers อื่น ๆ ที่ฉันเคยเห็นที่นั่น
jcollum

1
มันทำในสิ่งที่มันทำเมื่อฉันต้องการเปลี่ยนชื่อแบบเรียกซ้ำเพื่อล้างไฟล์จากเซิร์ฟเวอร์ Linux FTP ... แต่จำเป็นต้องเรียกใช้ในฐานะ Admin ก่อนที่จะทำงานได้อย่างถูกต้อง รู้สึกเหมือนเก่าโปรแกรมการยกเลิกการเก็บรักษา :)
เนลสัน

12

ตั้งแต่ Windows 7 คุณสามารถใช้PowerShellสำหรับงานเหล่านั้นได้

Get-ChildItem "C:\path\to\folder" -recurse | 
  Where {-Not $_.PSIsContainer} | 
  Rename-Item -NewName {$_.FullName.ToLower()}

- เลือกโฟลเดอร์รูทของคุณ
- ไฟล์ทั้งหมดภายในโฟลเดอร์รูทและโฟลเดอร์ย่อยจะถูกเปลี่ยนชื่อ
- ชื่อโฟลเดอร์จะถูกแยกออกด้วย Where {-Not $_.PSIsContainer} |


7

นี่คือวิธีแก้ไขปัญหาบรรทัดคำสั่งแบบเรียกซ้ำโดยใช้เฉพาะคำสั่ง cmd.exe ดั้งเดิมที่ใช้งานได้จริง ฉันเชื่อว่ามันเป็นวิธีแก้ปัญหาดั้งเดิมที่เป็นไปได้ง่ายที่สุด:

for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"

หากคุณยินดีที่จะก้าวข้ามคำสั่ง cmd.exe ดั้งเดิมแล้วตัวเลือกอื่นก็คือยูทิลิตี้การเปลี่ยนชื่อนิพจน์ปกติของJREN.BATที่รองรับตัวเลือกในการแปลงชื่อเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก มันเป็นสคริปต์บริสุทธิ์ (ไฮบริดสลี JScript / แบทช์) ที่ทำงานบนเครื่อง Windows ใด ๆ จาก XP เป็นต้นไป - ไม่จำเป็นต้องมีไฟล์ exe ของบุคคลที่สาม เอกสารแบบเต็มถูกสร้างขึ้นใน - เข้าถึงได้จากบรรทัดคำสั่งผ่านjren /?หรือjren /??ถ้าคุณต้องการเอาท์พุทเพจ

ด้วย JREN โซลูชันแบบเรียกซ้ำนั้นง่ายเหมือน:

jren "^" "" /s /l

1
ใช้งานได้ดี FYI ลบ/a-dสวิทช์ออกและจะทำให้ชื่อโฟลเดอร์เล็กลงด้วย
Keith

พยายามบันทึกมันเป็นไฟล์แบทช์และแตกใน system32 ดังนั้นฉันจึงสามารถเรียกใช้ได้ทุกเวลาด้วยคำสั่งเดียว ผลลัพธ์ในสิ่งนี้: การ" D"') was unexpected at this time.รันเป็นคำสั่งโดยตรงทำงานได้ดี แต่จะไม่ทำงานเมื่อทำงานเป็นไฟล์แบตช์ ไม่แน่ใจว่าจะทำงานเป็นแบตช์ไฟล์ได้อย่างไร แต่คิดว่าฉันจะแก้ปัญหานี้ได้
Don Cullen

1
@DonCullen - มันเป็นไวยากรณ์มาตรฐานที่สำหรับตัวแปรร้อยละจะต้องเป็นสองเท่าเมื่อใช้สำหรับภายในสคริปต์ชุด ดังนั้น%Dจะต้องเปลี่ยนไป%%Dและ%Fไป%%Fถ้าคุณใส่คำสั่งภายในสคริปต์ชุด
dbenham

เรียนรู้สิ่งใหม่ทุกวันเสมอ ขอบคุณ!
Don Cullen

6

ยูทิลิตี้ชุดที่ชื่นชอบการเปลี่ยนชื่อไฟล์ส่วนตัวของฉันคือWildRename Cylog ของ ท่ามกลางคุณสมบัติอื่น ๆ มันสามารถเปลี่ยนกรณีของชื่อไฟล์ สิ่งที่ดีที่สุดเกี่ยวกับ WildRename น่าจะรองรับการแสดงผลปกติ!


นี่คือแอพที่ถูกต้องหลังจากติดตั้งใน 10 วินาที ฉันกำหนดค่าและเปลี่ยนชื่อโฟลเดอร์ระยะไกลแบบเรียกซ้ำ (แมปเพื่อความสะดวก)
Matteo Conta

5

คำตอบที่ยอมรับเวอร์ชัน "Recursive" (ใช้งานได้ *)

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"') do (for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g"))


วงแรก

for /f "Tokens=*" %f in ('cmd /c "echo %cd%& dir /l/b/ad/s"')

รับรายการพา ธสัมบูรณ์ของไดเร็กทอรีทั้งหมดภายในปัจจุบัน (รวมถึง):

C: \ Foo>

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


วงที่สอง

for /f "Tokens=*" %g in ('dir /l/b/a-d "%f"') do (rename "%f"\"%g" "%g")

รับรายการชื่อไฟล์ทั้งหมด (หรือชื่อไฟล์และไดเรกทอรีถ้าคุณใช้/a-dสวิตช์) ภายในแต่ละพา ธสัมบูรณ์ที่พบโดยลูปแรกและแปลงชื่อไฟล์เหล่านี้เป็นตัวพิมพ์เล็ก

  • C: \ Foo \ TO.txt

  • C: \ Foo \ Bar \ LOWER.txt

  • C: \ Foo \ Bar \ Baz \ CASE.txt


* ต้องการสองลูปเนื่องจากอาร์กิวเมนต์ที่สองจะrenameต้องเป็นชื่อไฟล์และไม่ใช่พา ธ สัมบูรณ์ (เช่นเดียวกับ/sสวิตช์ที่ได้รับ)


ทำไมคุณมีcmd /c "echo %cd%& ในครั้งแรกfor? มันไม่จำเป็นอย่างสมบูรณ์
DavidPostill

@DavidPostill echo %cd%จะมีการเพิ่มโฟลเดอร์ปัจจุบันไปยังรายการเส้นทางที่แน่นอน ; และcmd /cทำให้&การทำงานที่จะรวมคำสั่ง ฉันเป็น Noob ทั้งหมดเกี่ยวกับWindows Batch Scripting ; ถ้าคุณรู้วิธีที่ดีกว่าอย่าลังเลที่จะปรับปรุงคำตอบ!
wc.matteo

งานที่ยอดเยี่ยมสำหรับ noob คุณเป็นคนแรกของ cmd.exe โซลูชั่นบรรทัดคำสั่งพื้นเมืองที่ใช้งานได้จริงยกเว้นว่าจะล้มเหลวเมื่อชื่อขึ้นต้นด้วยช่องว่างหรือเครื่องหมายอัฒภาคคำตอบที่ยอมรับนั้นประสบปัญหาเดียวกัน ดูคำตอบของฉันสำหรับคำตอบที่ง่ายขึ้นที่ยังใช้งานได้กับพื้นที่ชั้นนำหรืออัฒภาค
dbenham

สิ่งนี้สามารถแก้ไขเพื่อแปลงที่ต่ำกว่าเป็นตัวพิมพ์ใหญ่?
Rishav

3

คุณสามารถใช้กลยุทธ์ "การแทนที่อักขระ" ...

set Name=%Name:A=a%
set Name=%Name:B=b%
set Name=%Name:C=c%

... และอื่น ๆ สำหรับตัวอักษร AZ คุณอาจจะนำไปใช้ในรูปแบบของวงวน FOR


1

http://www.dostips.com/DtCodeCmdLib.php#Function.toLowerมีฟังก์ชั่นง่าย ๆ ที่คุณควรจะสามารถรวมและเรียกจากแบตช์ไฟล์

ให้แบตช์ไฟล์วนซ้ำตามโฟลเดอร์ / ชื่อไฟล์และเรียกใช้ฟังก์ชั่นนี้เพื่อสร้างชื่อรุ่นตัวพิมพ์เล็ก


1

จากhttp://windowsitpro.com/articles/index.cfm?articleid=81612 :

ใช้คำสั่งมาตรฐานเท่านั้นฉันมีสคริปต์ LwrCase.bat และ LwrCase_Folder.bat เพื่อเปลี่ยนชื่อไฟล์เป็นตัวพิมพ์เล็กหรือเปลี่ยนชื่อชื่อไฟล์ทั้งหมดในโฟลเดอร์เป็นตัวพิมพ์เล็ก

ในการเปลี่ยนชื่อไฟล์เป็นตัวพิมพ์เล็กให้ใช้:

[call] LwrCase FullyQualifiedFileName

โดยที่ FullyQualifiedFileName เป็นชื่อไฟล์แบบเต็มที่จะถูกเปลี่ยนชื่อ

ในการเปลี่ยนชื่อชื่อไฟล์ทั้งหมดในไดเรกทอรีให้ใช้:

[call] LwrCase_Folder FullyQualifiedDirectoryName [/S]

โดยที่ FullyQualifiedDirectoryName เป็นพา ธ โฟลเดอร์ที่ผ่านการรับรองโดยสมบูรณ์และ / S เป็นพารามิเตอร์ทางเลือกที่จะเปลี่ยนชื่อชื่อไฟล์ในโฟลเดอร์ย่อยทั้งหมด

หมายเหตุ: LwrCase.bat ใช้สวิตช์ / L ของคำสั่ง DIR ซึ่งส่งคืนชื่อตัวพิมพ์เล็ก

LwrCase.batประกอบด้วย:

@echo off
if {%1}=={} @echo Syntax: LwrCase FullyQualifiedFileName&goto :EOF
if not exist %1 @echo LwrCase - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set file=%%a
)
if /i "%file:~0,1%" EQU "d" @echo LwrCase - %1 is NOT a file.&endlocal&goto :EOF
for /f "Tokens=*" %%f in ('dir %1 /L /b /a /a-d') do (
 Rename %1 "%%f"
)
endlocal

LwrCase_Folder.batประกอบด้วย:

@echo off
if {%1}=={} @echo Syntax: LwrCase_Folder FullyQualifiedDirectoryName&goto :EOF
if not exist %1 @echo LwrCase_Folder - %1 NOT found.&goto :EOF
setlocal
for /f "Tokens=*" %%a in ('@echo %~a1') do (
 set folder=%%a
)
if /i "%folder:~0,1%" NEQ "d" @echo LwrCase_Folder - %1 is NOT a folder.&endlocal&goto :EOF
pushd %1
set sw=/B /A /A-D
if /i {%2}=={/S} set sw=%sw% %2
for /f "Tokens=*" %%f in ('dir %sw%') do (
 call LwrCase "%%f"
)
popd
endlocal

1

โปรแกรมที่ดีที่สุดสำหรับการทำเช่นนี้ใน Windows เป็นจำนวนมากเปลี่ยนชื่อยูทิลิตี้ มันเป็นเครื่องมือม็อง คุณสามารถใช้ regex เพื่อเปลี่ยนชื่อไฟล์และ / หรือโฟลเดอร์ นอกจากนี้ยังมีการรวมเชลล์ (เพื่อให้คุณสามารถดำเนินการจาก explorer ด้วยการคลิกขวา) ซึ่งดีมาก มีเวอร์ชัน 64 บิตและ 32 บิต


1

คำตอบที่ยอมรับสำหรับคำถามนี้โดยloftysnake ใช้งานได้กับไดเรกทอรีปัจจุบัน แต่ไม่ค้นหาโฟลเดอร์ย่อย  Sawnyแนะนำการแก้ไขแบบง่าย ๆ กับคำตอบของ loftysnake เพื่อให้สามารถเรียกซ้ำได้ แต่มันไม่ทำงานเพราะในขณะที่renameคำสั่งอนุญาตให้คุณระบุไดรฟ์และเส้นทางด้วยชื่อไฟล์ 1 (แหล่งที่มา) ชื่อไฟล์ 2 (ปลายทาง) ต้องเป็นชื่อไฟล์ . ในการพูดข้อความ help ( /?)

... คุณไม่สามารถระบุไดรฟ์หรือเส้นทางใหม่สำหรับไฟล์ปลายทางของคุณ

แต่ใช้moveงานrenameไม่ได้ดังนั้นคุณสามารถเปลี่ยนชื่อไฟล์ซ้ำเป็นตัวพิมพ์เล็กด้วยคำสั่งนี้:

for /f "Tokens=*" %f in ('dir /l/b/a-d/s') do (move /y "%f" "%f")

เพราะปรากฎว่าMoveสามารถรับมือกับเส้นทางไดเรกทอรี

คำสั่งดังกล่าวจะทำงานเมื่อพิมพ์ลงในพร้อมท์คำสั่ง ( CMD.EXE) โดยตรง หากคุณต้องการทำสิ่งนี้จากภายใน.BATไฟล์batch ( ) คุณต้องเพิ่ม%อักขระเป็นสองเท่า:

for /f "Tokens=*" %%f in ('dir /l/b/a-d/s') do (move /y "%%f" "%%f")

และคุณอาจทิ้งวงเล็บไว้/y และพูดdo move …ออกไปก็ได้


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

ขออภัยฉันกำลังชี้ให้เห็นว่าmoveทำงานrenameได้ไม่ดีและฉันคิดว่าฉันเป็นคนเดียวที่แนะนำการใช้moveคำสั่งที่นี่ ฉันเพียงแค่ใช้ @loftysnake และคำแนะนำของ @sawny และหวังว่าพวกเขาจะปรับปรุงเล็กน้อย
เอเดรีย

แปลกแฮะ, แปลกนะ, มันแปลก ๆ นะ; ฉันคิดว่ามีคนอื่นพูดถึงmoveแต่ฉันหามันไม่เจอในตอนนี้
สกอตต์

0

โซลูชันแบบเรียกซ้ำ ใส่สิ่งนี้ลงในไฟล์ recursiverename.cmd ..

for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
for /r /d %%x in (*) do (
    pushd "%%x"
    for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f")
    popd
)

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