批处理里最让人头疼的取文,往往不是无后逻辑,而是取文字符串操作。你写了个循环,无后想处理一堆文件,取文结果文件名带着扩展名,无后把整个判断搅得一团糟。取文今天直接给结论:用%%~nI这个变量修饰符,无后三秒钟拿到无后缀文件名。取文
拿个实际场景说事。无后你有一文件夹的取文.mp4视频,想批量生成同名.srt字幕文件(哪怕是无后空的)。写个for循环遍历,取文结果变量%%I里存的无后是movie.mp4,你要拼接movie.srt,取文直接写%%I.srt?那输出就是movie.mp4.srt,蠢得冒泡。这时候%%~nI就派上用场了——它只取movie部分,扩展名被剥得干干净净。
具体语法长这样:
@echo off for %%I in (*.mp4) do ( echo %%~nI.srt ) 跑一下,控制台吐出来的全是movie.srt这种干净名字。要是想连路径一起保留,用%%~dpnI,d是盘符,p是路径,n就是文件名主体。比如C:\videos\movie,你再拼上.srt,完美对应原视频位置。
但这里有个坑,新手常踩。变量修饰符必须在for循环里才有效。你单独设个set filename=movie.mp4,然后写echo %~nfilename?对不起,批处理不认这套。它只会原样输出~nfilename,像个傻子一样。要么你老老实实用for循环包裹,要么就得用set的字符串替换:set name=!filename:.mp4=!——但这只能处理固定扩展名,碰到.tar.gz这种复合后缀就抓瞎。
还有种更隐蔽的情况。文件名里藏着空格,比如我的 电影 (2024).mp4。直接用%%~nI没问题,它会智能识别最后一个点号的位置,空格不影响。但你要是手动用for /f "delims=."去切,遇到这种名字直接碎成几段,得写一堆临时变量拼接,纯粹自找麻烦。
我自己的习惯是,凡是需要批量重命名、批量生成关联文件,一律用%%~nI打底。它不挑扩展名长度,.a也好.jpeg也罢,通吃。甚至文件没有扩展名,比如README,%%~nI返回的还是README,不会报错。
最后提醒一句,在批处理文件里写%%~nI,双百分号是必须的。但如果你直接在命令行窗口敲,得改成单百分号%~nI。这破规矩我当年记混过好几次,后来索性全写在.bat文件里调试,省心。
工具这东西,知道就是一层窗户纸。下次再看到有人对着文件名后缀发愁,你可以直接把这段代码甩过去——for %%I in (*.*) do echo %%~nI,让他自己品。

喜欢
讨厌