如何在批处理中对自定义变量使用类似%~n1的文件名提取语法?
如何在批处理中对自定义变量使用类似%~n1的文件名提取语法?
嘿,我完全懂你碰到的这个坑——批处理里的%~n1这类文件名扩展语法,确实只直接支持命令行参数(比如%1、%2这些),咱们自己定义的变量没法直接套用%~n变量名这种写法。不过别慌,有几个简单的办法能实现你想要的效果,我给你一步步说清楚:
方法一:用for循环二次处理自定义变量
既然for循环的元变量(比如%%a)支持那些~开头的扩展语法,那咱们可以把已经存好的自定义变量值,再传给一个for循环的元变量,就能提取出文件名了。比如:
:: 先按你的逻辑设置InFile变量 for %%a in (*.drf) do (set "InFile=%%a") :: 提取InFile的纯文件名(不带扩展名) for %%b in ("%InFile%") do set "FileNameOnly=%%~nb" :: 测试输出,比如MyFile.drf会变成MyFile echo 提取后的文件名:%FileNameOnly%
这里给%InFile%套上引号是为了兼容带空格的文件名,避免处理时出错。同理,如果要提取全名(文件名+扩展名),就用%%~nxb,和%~nx1的效果一样。
方法二:在原循环内直接提取(更高效)
如果你是在遍历.drf文件的同一个循环里就要用这个文件名,其实根本不用先存InFile变量再二次处理,直接在循环里用元变量的扩展语法就行:
for %%a in (*.drf) do ( set "InFile=%%a" :: 直接用%%~na拿到当前文件的纯文件名 set "FileNameOnly=%%~na" :: 实时输出看看效果 echo 当前文件全名:%%a,纯文件名:%%~na )
注意:延迟变量扩展的坑
要是你需要在循环外面使用循环里设置的FileNameOnly变量,记得要启用延迟变量扩展,不然会拿不到正确的值。比如:
setlocal enabledelayedexpansion for %%a in (*.drf) do ( set "InFile=%%a" set "FileNameOnly=%%~na" :: 这里要用!代替%来访问延迟变量 echo 循环内实时获取的文件名:!FileNameOnly! ) :: 循环结束后也可以用!来访问 echo 循环结束后的值:!FileNameOnly! endlocal
总的来说,核心思路就是借助for循环元变量的扩展能力——毕竟那些~开头的语法是为命令行参数和for元变量设计的,自定义变量没法直接用,转一手就能解决问题啦。
备注:内容来源于stack exchange,提问作者Mr. Mendelli
相关产品推荐
相关产品推荐

