例如,我有以下路径:
"C:\Windows\Example\001 Example\005 Example"
我必须从此字符串中提取"005 Example"
。我已尝试使用"set path=%path:~0,11%"
,但路径也可以是"C:\Windows\Example\001 Example\005 Example_2"
我需要的是在最后一个“\”后剪切字符串
我怎样才能做到这一点?
答案1
首先,不要将其用作path
变量名。Windows 命令提示符(与 Unix 的大多数组件(包括 shell)不同)以不区分大小写的方式处理变量名,因此path
与 相同PATH
,这是您的执行搜索路径,如果您为其分配一些随机的东西,那么您将陷入困境。
使用表格。(我假设您知道记录这些表格。)这是替换:%variable:str1=str2%
set /?
C:\> set play=food
C:\> echo %play:foo=bar%
bard
C:\> set animal=cat
C:\> echo %animal:at=ow%
cow
这支持非常有限模式匹配功能; 将查找并删除所有内容,包括第一次出现的%variable:*str1=str2%
str1
并将其替换为str2
。特别是,将用 null替换直到第一个为止的所有内容。例如,如果是,则将计算为 (不带)。如果您的路径名始终有四个级别,您可以这样做%variable:*\=%
\
%pathname%
C:\Windows\Example\001 Example\005 Example
%pathname:*\=%
Windows\Example\001 Example\005 Example
C:\
for %%I in (%pathname%) do set tempname=%%~I
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set basename=%tempname%
echo %basename%
该for
语句有点混乱。它是一个循环,保证只执行一次,索引变量%%I
设置为值%pathname%
1。然后它分配%%~I
给tempname
。
%%~I
是 的值%%I
(即 的值%pathname%
),但如果该字符串以引号 ( "
) 字符开头和结尾,则会将其删除。如果您确定%pathname%
不以引号开头和结尾(例如,因为您已经这样做了,或者做了类似的事情),您可以跳过此步骤,只需说 即可set tempname=%pathname%
。
如果路径名的层数不确定,则
for %%I in (%pathname%) do set tempname1=%%~I
:loop
set tempname2=%tempname1:*\=%
if not %tempname1% == %tempname2% ( set tempname1=%tempname2% & goto loop )
set basename=%tempname1%
echo %basename%
循环直到没有\
s 为止。______________
1 实际上,如果为空,或者包含通配符(模式匹配)字符(如和)
,其行为可能会更复杂。可能还有其他我尚未发现的特殊情况。(如果有更简洁的方式来处理引号,请告诉我。)%pathname%
?
*
警告:我观察 到如果为空则行为会很奇怪。%variable:str1=str2%
%variable%