ชุด: ลบนามสกุลไฟล์


155

ฉันมีชุดสคริปต์ต่อไปนี้จาก Wikipedia:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%f
)
pause

ใน for-loop ไฟล์ทั้งหมดที่มีนามสกุล flv ได้รับการสะท้อน แต่ฉันต้องการให้ดำเนินการบางอย่างกับไฟล์ที่ฉันต้องการหนึ่งครั้งไฟล์ที่ไม่มีนามสกุลและครั้งเดียวกับนามสกุล ฉันจะได้รับสองสิ่งนี้ได้อย่างไร

ฉันค้นหาวิธีแก้ปัญหา แต่ไม่พบ ฉันเป็นมือใหม่ในชุด ...

คำตอบ:


309

คุณสามารถใช้%%~nfเพื่อรับชื่อไฟล์ตามที่อธิบายไว้ในการอ้างอิงสำหรับfor:

@echo off
    for /R "C:\Users\Admin\Ordner" %%f in (*.flv) do (
    echo %%~nf
)
pause

ตัวเลือกที่ใช้ได้มีดังนี้:

ตัวแปรที่มีตัวแก้ไขคำอธิบาย

% ~ ฉันขยาย% I ซึ่งจะลบสิ่งที่อยู่รอบ ๆ ออก 
                        อัญประกาศ ("").
% ~ fI ขยาย% I เป็นชื่อพา ธ แบบเต็ม
% ~ dI ขยาย% I ไปยังตัวอักษรของไดรฟ์เท่านั้น
% ~ pI ขยาย% I ไปยังเส้นทางเท่านั้น
% ~ nI ขยาย% I เป็นชื่อไฟล์เท่านั้น
% ~ xI ขยาย% I เป็นนามสกุลไฟล์เท่านั้น
% ~ sI ขยายเส้นทางเพื่อให้มีชื่อย่อเท่านั้น
% ~ aI ขยาย% I ไปยังแอตทริบิวต์ของไฟล์
% ~ tI ขยาย% I ไปยังวันที่และเวลาของไฟล์
% ~ zI ขยาย% I ตามขนาดของไฟล์
% ~ $ PATH: ฉันค้นหาไดเรกทอรีที่ระบุไว้ในสภาพแวดล้อมของ PATH 
                        ตัวแปรและขยาย% I เป็นชื่อที่ผ่านการรับรองโดยสมบูรณ์ของ 
                        คนแรกที่พบ หากชื่อตัวแปรสภาพแวดล้อมคือ
                        ไม่ได้กำหนดหรือไม่พบไฟล์โดยการค้นหา
                        ตัวดัดแปลงนี้ขยายเป็นสตริงว่าง    

8
เพียงอย่างรวดเร็วทราบ: ในตัวอย่างข้างต้น%% ฉจะเป็นสิ่งที่ชอบC:\Users\Admin\Ordner\foo.flvและ%% ~ nffooจะให้คุณ หากคุณต้องการทุกอย่างยกเว้นส่วนขยายใช้%% ~ df %% ~ pf %% ~ nfซึ่งจะให้คุณC:\Users\Admin\Ordner\foo
ehambright

8
@ eebright ความคิดเห็นตอนปลาย แต่ฉันเดาว่าการใช้%%~dpnfจะเป็นทางเลือกที่สั้นกว่า

ขอบคุณสำหรับการแก้ไข / คำอธิบายตาราง Dirk กรณีของฉันได้รับชื่อไฟล์โดยไม่มีนามสกุลจาก param %1ในชุดสคริปต์ echo %~n1คือสิ่งที่ฉันเป็นหลังจากนั้น
Dave Pile

26

ในกรณีที่ไฟล์ตัวแปรของคุณไม่มีอยู่จริงFORวิธีการไม่ทำงาน เคล็ดลับหนึ่งที่คุณสามารถใช้ถ้าคุณทราบความยาวของส่วนขยายนั้นกำลังใช้สตริงย่อย:

%var:~0,-4%

-4หมายความว่าตัวเลข 4 หลักสุดท้าย (สมมุติ.ext ) จะถูกตัดทอน


สิ่งนี้ไม่ได้ผลสำหรับฉัน (บน Win8.1) - บางทีฉันอาจเข้าใจผิดเมื่อลองecho %f:~0,-4%ในบริบทของตัวอย่างที่ใช้ในคำถาม ผมทำอะไรผิดหรือเปล่า?
Wolf

2
เห็นได้ชัดว่าใช้ได้กับตัวแปร "ปกติ" ไม่ใช่สำหรับตัวแปร (หรือบางทีฉันก็ไม่รู้ไวยากรณ์ที่ถูกต้อง) อย่างไรก็ตามสิ่งนี้จะทำงานในบริบทของตัวอย่าง OP: SET fl=%%fแล้วecho %fl:~0,-4%
Ohad Schneider

@Wolf คุณจะต้องคุ้มค่าชุดของตัวแปร loop ให้กับตัวแปรปกติแล้วทำสตริงทดแทน / ตัดในปกติตัวแปร
phuclv

ในกรณีที่มากพอความยาวของนามสกุลไม่เท่ากับ 3 หรือไม่เป็นที่รู้จัก คุณยังสามารถใช้สำหรับถึงแม้ว่าไฟล์ไม่มีอยู่ดูคำตอบของฉัน
marsze

14

ฉันยังเป็นคนแปลกหน้าสำหรับ windows cmd ด้วย แต่ลองทำสิ่งนี้:

echo %%~nf

8

นี่เป็นการตอบกลับที่ช้ามาก แต่ฉันมาเพื่อแก้ไขปัญหาเฉพาะที่ฉันมีด้วย DiskInternals LinuxReader ต่อท้าย '.efs_ntfs' ลงในไฟล์ที่บันทึกไว้ในไดเรกทอรีที่ไม่ใช่ NTFS (FAT32):

@echo off
REM %1 is the directory to recurse through and %2 is the file extension to remove
for /R "%1" %%f in (*.%2) do (
    REM Path (sans drive) is given by %%~pf ; drive is given by %%~df
    REM file name (sans ext) is given by %%~nf ; to 'rename' files, move them
    copy "%%~df%%~pf%%~nf.%2" "%%~df%%~pf%%~nf"
    echo "%%~df%%~pf%%~nf.%2" copied to "%%~df%%~pf%%~nf"
echo.
)
pause

ฉันไม่แน่ใจว่ามันตอบคำถามที่ถาม แต่จริง ๆ แล้วมันช่วยฉันขอบคุณ!
matan7890

1
@ matan7890 True; op ไม่ได้ระบุว่า "ฉันต้องการให้การดำเนินการบางอย่างกับไฟล์" [sic] มีความหมาย แต่การกระทำอย่างใดอย่างหนึ่งอาจเปลี่ยนชื่อพวกเขาในกรณีนี้คำตอบของฉันคือการขยายคำตอบที่ยอมรับ
Agi Hammerthief

สิ่งนี้ช่วยเพื่อนของฉันที่เปิดไฟล์แนบและ.encryptedเพิ่มไฟล์ทั้งหมดของเขาพร้อมกับความต้องการค่าไถ่ เห็นได้ชัดว่าสคริปต์การโจมตีจะต้องเป็นไฟล์แบตช์ซึ่งเป็นสิ่งที่ตรงกันข้ามกับสิ่งนี้และถูกเพิ่มลง.encryptedในไฟล์ทั้งหมด
AwokeKnowing

1
upvoted เพราะคุณพูดถึงไดรฟ์เส้นทางและการขยาย ( %% ~ DF %% ~ PF %% ~ nf ) ซึ่งส่วนใหญ่คล้ายกับการส่งออกของฉ %%จากคำถามเดิมแทนการเพียงแค่ชื่อไฟล์โดยไม่มีนามสกุล ( %% ~
nf

5

ฉันใช้สิ่งนี้หากฉันต้องการดึงส่วนขยายจากตัวแปร (โดยไม่ต้องวนซ้ำไดเรกทอรีหรือไฟล์ที่มีอยู่):

for %%f in ("%filename%") do set filename=%%~nf

หากคุณต้องการตัดส่วนขยายจากเส้นทางแบบเต็มให้ใช้%%dpnfแทน:

for %%f in ("%path%") do set path=%%~dpnf

ตัวอย่าง:

(ใช้โดยตรงในคอนโซล)

@for %f in ("file name.dat") do @echo %~nf
@for %f in ("C:\Dir\file.dat") do @echo %~dpnf

OUTPUT:

file name
C:\Dir\file

0

ใช้ทุบตี cygwin เพื่อทำการสับ

  :: e.g. FILE=basename.mp4 => FILE_NO_EXT=basename
  set FILE=%1
  for /f "delims=" %%a in ('bash -c "FILE=%FILE%; echo ${FILE/.*/}" ') do set FILE_NO_EXT=%%a

0

หากตัวแปรของคุณเป็นอาร์กิวเมนต์คุณสามารถใช้%~dpnตามด้วยหมายเลขอาร์กิวเมนต์ดังนั้นคุณไม่ต้องกังวลกับความยาวส่วนขยายที่แตกต่างกัน

ตัวอย่างเช่น%~dpn0จะส่งคืนพา ธ ของไฟล์แบตช์ที่ไม่มีนามสกุล%~dpn1จะ%1ไม่มีนามสกุล ฯลฯ

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