当前位置:  开发笔记 > 开发工具 > 正文

在批处理文件中执行子字符串的最佳方法是什么?

如何解决《在批处理文件中执行子字符串的最佳方法是什么?》经验,为你挑选了3个好方法。

我想获取当前正在运行的批处理文件的名称,没有文件扩展名.

感谢这个链接,我的文件名带有扩展名......但是在批处理文件中执行子字符串的最佳方法是什么?

或者是否有其他方法来获取没有扩展名的文件名?

在这种情况下,可以安全地假设3个字母的扩展名.



1> Joey..:

好吧,只是获取批处理的文件名最简单的方法就是使用%~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该语法的详细信息,请参阅


子串提取不适用于FOR循环变量,因此您必须执行以下操作(代码中的\ r \n表示换行符,因为SO似乎不允许在注释中使用换行符):`setlocal ENABLEDELAYEDEXPANSION\r \n for/f %% s in('set')do(\ r \n设置tmp = %% s\r \n echo!tmp:〜-3!\ r \n)`
@Adrian为什么不呢?`FOR`是批处理文件中的基础构造,执行大量不同的任务.顺便说一下,还有一种方法可以通过使用子程序来处理任务,即`for/f %% s in('set')执行调用:DoSmth"%% s"\ r \n ...\r \n :DoSmth\r \n设置var =%1\r \n echo%var:~1,3%`

2> 小智..:

很好地解释了上面!

对于那些可能像我一样受苦的人来说,在本地化的Windows(我的是斯洛伐克的XP)中工作,你可以尝试%!

所以:

SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!


请注意,这仅在`setlocal ENABLEDELAYEDEXPANSION`命令之后才有效

3> jeb..:

作为一个额外的信息,以Joey的答案,这是不是在帮助说明set /?,也没有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总是扩展为函数的名称,而不是批处理文件的名称.
但是如果你使用至少一个修饰符,它将再次显示文件名!

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有