Batch file 批处理:具有2个变量的循环中的子字符串

Batch file 批处理:具有2个变量的循环中的子字符串,batch-file,for-loop,Batch File,For Loop,我有一个循环,在文件上循环,获取实际的文件名(不包括整个路径),并尝试检查该文件名是否存在于某个列表中。 我的密码是: setlocal enabledelayedexpansion enableextensions for /R %%j in (*.c) do ( set MYVAR=%%j set actualFileName=%%~nj if NOT "%MY_FILE_LIST%"=="!MY_FILE_LIST:%actualFileName%=!" set "TOCOMPILE=!T

我有一个循环,在文件上循环,获取实际的文件名(不包括整个路径),并尝试检查该文件名是否存在于某个列表中。 我的密码是:

setlocal enabledelayedexpansion enableextensions
for /R %%j in (*.c) do (
set MYVAR=%%j
set actualFileName=%%~nj
if NOT "%MY_FILE_LIST%"=="!MY_FILE_LIST:%actualFileName%=!" set "TOCOMPILE=!TOCOMPILE! %MYVAR%"
此代码不起作用,因为实际文件名是用%而不是!访问的!。 但是MYVAR:~!实际文件名!!也不行。
我能做什么?

您可以直接使用
for
可替换参数修饰符来获取所需信息

for/r%%j in(*.c)do(
echo实际文件名为%%~nj
)
其中,
%%~nj
是在
%%j
中引用的文件的名称,不带扩展名。有关完整列表,请参见
获取/?

编辑以适应评论

setlocal enableextensions enabledelayedexpansion
对于%%j英寸(*.c)do(
如果不是“!我的文件列表:%%~nj!”=%MY\u文件列表%”(
设置“TOCOMPILE=!TOCOMPILE!”%%~fj”
)
)
如果没有任何文件的名称中包含感叹号,则应执行此操作。如果不能保证这一点

setlocal enableextensions disabledelayedexpansion
对于%%j英寸(*.c)do(
延迟扩展
如果不是“!我的文件列表:%%~nj!”=%MY\u文件列表%”(
对于/f“delims=“%%a in(“!TOCOMPILE!”)do(
端部
设置“TOCOMPILE=%%a”%%~fj”
)
)else endlocal
)

使用另一个嵌套的FOR

可能重复的感谢!,但我现在的问题是下一步。我已经编辑了这个问题。
setlocal enabledelayedexpansion enableextensions
for /R %%j in (*.c) do (
 set MYVAR=%%j
 set lastIndex= some calculation to find last index of /


 for /f "tokens=* delims=" %%# in ("!lastIndex!") do (
    set actualFileName=!MYVAR:~%%#!
 )

)