我想获取当前正在运行的批处理文件的名称,不带文件扩展名。
感谢这个链接,我有了带有扩展名的文件名......但是在批处理文件中执行子字符串的最佳方法是什么?
还是有另一种方法来获取不带扩展名的文件名?
在这种情况下,假设 3 个字母扩展是安全的。
我想获取当前正在运行的批处理文件的名称,不带文件扩展名。
感谢这个链接,我有了带有扩展名的文件名......但是在批处理文件中执行子字符串的最佳方法是什么?
还是有另一种方法来获取不带扩展名的文件名?
在这种情况下,假设 3 个字母扩展是安全的。
好吧,为了获取批处理的文件名,最简单的方法就是使用%~n0
.
@echo %~n0
将输出当前运行的批处理文件的名称(不带扩展名)(除非在由 调用的子例程中执行call
)。可以help for
在帮助的最后找到此类“特殊”路径名替换的完整列表:
此外,增强了 FOR 变量引用的替换。您现在可以使用以下可选语法:
%~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file %~$PATH:I - searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
可以组合修饰符以获得复合结果:
%~dpI - expands %I to a drive letter and path only %~nxI - expands %I to a file name and extension only %~fsI - expands %I to a full path name with short names only
但是,要准确回答您的问题:子字符串使用以下:~start,length
符号完成:
%var:~10,5%
将从环境变量中的位置 10 中提取 5 个字符%var%
。
注意:字符串的索引是从零开始的,所以第一个字符在位置 0,第二个在 1,依此类推。
要获取参数变量的子字符串,例如%0
,%1
等,您必须首先使用以下方法将它们分配给普通环境变量set
:
:: Does not work:
@echo %1:~10,5
:: Assign argument to local variable first:
set var=%1
@echo %var:~10,5%
语法更强大:
%var:~-7%
从中提取最后 7 个字符%var%
%var:~0,-4%
将提取除最后四个字符之外的所有字符,这也会使您摆脱文件扩展名(假设句点 [ .
] 后有三个字符)。有关help set
该语法的详细信息,请参阅。
上面解释的很好!
对于所有可能像我一样在本地化 Windows 中工作的人(我的是斯洛伐克的 XP),您可以尝试%
将!
所以:
SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
作为乔伊答案的附加信息,在set /?
nor的帮助中没有描述for /?
。
%~0
扩展为自己的批次的名称,与输入的完全相同。
因此,如果您开始批处理,它将扩展为
%~0 - mYbAtCh
%~n0 - mybatch
%~nx0 - mybatch.bat
但是有一个例外,在子程序中展开可能会失败
echo main- %~0
call :myFunction
exit /b
:myFunction
echo func - %~0
echo func - %~n0
exit /b
这导致
main - myBatch
Func - :myFunction
func - mybatch
在函数%~0
中总是扩展为函数的名称,而不是批处理文件的名称。
但是,如果您使用至少一个修饰符,它将再次显示文件名!