使用批处理命令进行子字符串提取

7

我在批处理文件中有以下内容:

set path=c:\temp\test

基本上,我想要一个输出,它会给我结果为c:\ temp \。

我没有找到任何类似于bat命令的indexof等效命令。

谢谢。

4个回答

5

背景:

>set fullname=c:\mypath\oldfile
>set changedname=%fullname:oldfile=newfile%
>echo %changedname%
c:\mypath\newfile

应用于问题:

> set fullname=c:\mypath\oldfile
> set pathonly=%fullname:oldfile=%
> echo %pathonly%
c:\mypath\

3

有一个问题让我非常希望 4DOS 仍然存在。但是,我在 alt.msdos.batch.nt 找到了一些可能有用的东西。命令 help set 中的手册页面似乎包含了大部分相同的信息。

set test=123456789

rem extract chars 0-5 from the variable test
set test=%test:~0,5%

echo %test%

(注:已在Windows XP SP3上测试)

1

你为什么想要那个?

Johannes的回答是一个可能的解决方案,但也许你所指的路径可以作为脚本的参数传递,这种情况下你可以使用以下语法:

REM Extracts the drive and path from argument %1
SET p=%~dp1

或者您可以结合..和脚本路径(%0):

REM Sets p to a sibling of the script directory
SET p=%~dp0..\test

0

朴素的子字符串存在一个问题,即每次路径更改时都必须进行调整,并且它不是解决问题的通用解决方案。

以下批处理文件提供了一个概念证明,说明如何执行路径的截断部分:

@echo off
set foo=C:\Temp\Test
call :strip
echo %foo%
goto :eof

:strip
if not "%foo:~-1%"=="\" (
    set foo=%foo:~0,-1%
    goto :strip
)
goto :eof

它是硬编码到一个单一的变量中,但如果需要的话很容易修复。

这里的核心部分是strip子程序,它循环并截断字符串的最后一个字符,直到找到反斜杠。这有效地删除了路径的最后一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接