批处理文件在for循环中获取起始和结束字符

3

你好,我在尝试找出如何在批处理文件中获取字符串变量的末尾字符,但是遇到了困难。我可以使用SET subStr=!sub:~1,1!来轻松获取第一个字符,但我真正想做的只是查找字符串是否包含~,因此我尝试了一些示例,但由于我在for循环中进行操作,所以这更具有挑战性。我有一个函数可以获取字符串长度,它运行良好,但我无法弄清楚如何将变量与子命令一起使用,例如:

FOR /F %%i IN ('DIR /b "%protoDir%" *.proto 2^>NUL') DO (
  :: Check and ignore tilde temp files which start or ends with ~
  SET sub=%%i 

  call :strLen sub str
  ECHO strLength=!str! 
  SET /A len=!str!-1
  ECHO length - 1 = !len!
  SET subStr2="!sub:~!len!,!len!!"  <-- ERROR IS HERE
  ECHO !subStr2!

  SET subStr=!sub:~1,1!   
  IF NOT !subStr! == ~ (
    IF NOT !subStr2! == ~ ( SOME CODE HERE... )
  )
)

:: Function to get a strings length 
:strLen
setlocal enabledelayedexpansion
:strLen_Loop
if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof

输出结果为:

strLength=26

长度 - 1 = 25

"ReceiverDiagnostics.proto lenlen",应该是 ~

我更愿意使用下面这段代码,因为它更加简单,但是即使使用 !,我也无法在 for 循环内让它工作。

IF NOT "%foobar%"=="%foobar:~=%" ( ECHO string contains ~ )

表达式 !sub:~1,1! 实际上返回的是第二个字符。无论如何,要检查一个字符串是否包含 ~,你可以这样做:if not "!sub!"=="!sub:*~=!" echo String contains '~'.(注意 *)... - aschipfl
毫无疑问,将您的“Dir”命令行的结果通过[tag:find]或更好的[tag:findstr]进行过滤,以过滤掉以波浪号开头和/或结尾的文件名,而不是将它们传递给“Do”,然后使用“If”进行过滤,这样做更有意义。 - Compo
1个回答

1

是的,你不能使用表达式!sub:~=!,因为这与子字符串扩展语法(例如!sub:~1,1!)和子字符串替换语法(例如!sub:search=replace!)冲突。

但是,你可以使用子字符串替换功能的以下特殊情况:!sub:*search=replace!,它将替换所有的内容,包括第一个出现的search,并用replace代替,因为搜索字符串允许以~开头:

if not "!sub!"=="!sub:*~=!" echo String contains '~'.

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