如何在Windows批处理文件中提取字符串的一部分?


30

假设我有一个存储在批处理(cmd)文件中的变量中的值,例如“ Abc_123”。我想最后得到一个仅包含“ 123”的变量。有内置的方法吗?

只要方法或性能内置在典型的Windows(Vista / 2008)系统中,我就不会非常挑剔。

Answers:


40

使用子字符串语法:

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123

4
您可以看到完整的语法,help set在批处理文件中创建子字符串的最佳方法是什么?在StackOverflow上。
User5910 16-10-25

1
如果我需要4和3作为变量输入,我该怎么做?%string:~%start%,%len%%
MakPo

没关系。我找到了答案。ss64.com/nt/syntax-substring.html
MakPo

3
总结来自@MakPo的链接:使用CALL,例如CALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny

8

如果您只想在下划线之后输入所有内容(不一定知道字符串的长度或下划线在哪里,而是可以仅依靠一个下划线),请尝试:

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

基本上,您的字符串将使用下划线作为定界符(delims = _)拆分为标记。仅第二个(令牌= 2)将(作为变量%% a)传递给for循环。由于在这种情况下只处理单个字符串,因此循环只会运行一次。

如果要在下划线之前和之后保存内容,请尝试:

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

请注意,%% a是拆分的第一个标记的变量;%% b是拆分的第二个标记的变量。


3

如果您发现批处理语言的功能不足以执行您想要的操作-并且可能不会花很长时间到达这一点-您可以使用Windows PowerShell。默认情况下,不是所有版本的Windows都安装此程序,但是您可以免费下载。

如果您不喜欢PowerShell语言,则可以使用Perl。不过,您必须在所有系统上安装它。也有其他人。


问题不是问Powershell或Perl
Zimba,

2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

3
这具体是做什么的?
Pimp Juice IT

哦,如果您要问这段代码是如何工作的:它将删除数字前的所有内容,并在其前添加下划线。
Zimba

@Zimba是否可以将其简单地扩展为“ last _”?另外,在任何文档中我都可以在哪里找到?
TWiStErRob

确定,找到一个文档,添加到答案。问题依然存在:我如何*贪婪?我使用了很好的ol' IF NOT ... GOTO :replace,但是如果有更好的方法,那就更好了。
TWiStErRob

1
@TWiStErRob:我知道了。如果您不知道有多少个_,则循环到最后一个,然后set var
Zimba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.