变量子串在for循环内编辑/替换

时间:2018-08-04 17:06:28

标签: windows batch-file cmd

我想替换以前存储在for循环内的变量的子字符串,我试图这样做,但没有用:

setlocal EnableDelayedExpansion
set checkVar=abcd
FOR %%Y IN (*.pdf) DO (  
    SET meu=%%Y
    CALL SET meuWithoutChar=!meu:%%%checkVar%%%=! 
    ECHO meuWithoutChar=!meuWithoutChar!
)

例如此处if %%Y==blepabcdnnnn.pdf;我想在输出上显示meuWithoutChar=blepnnnn.pdf 预先谢谢你

2 个答案:

答案 0 :(得分:2)

您对延迟扩展的概念以及使用CALL获得扩展的额外阶段感到困惑。这里是例子。我只是使用您的单个文件示例。您可以将其改回使用通配符。

呼叫示例

@echo off
set checkVar=abcd
FOR %%Y IN (blepabcdnnnn.pdf) DO (  
SET "meu=%%Y"
CALL SET "meuWithoutChar=%%meu:%checkVar%=%%" 
CALL ECHO meuWithoutChar=%%meuWithoutChar%%
)
pause

延迟扩展

@echo off
setlocal Enabledelayedexpansion
set checkVar=abcd
FOR %%Y IN (blepabcdnnnn.pdf) DO (  
SET "meu=%%Y"
SET "meuWithoutChar=!meu:%checkVar%=!" 
ECHO meuWithoutChar=!meuWithoutChar!
)
pause

答案 1 :(得分:1)

作为Squashmans答案的补充/扩展。
仅循环浏览必要的文件,而忽略文件的扩展名。

没有延迟的扩展:

@Echo Off
SetLocal DisableDelayedExpansion
Set "strChr=abcd"
For %%A In ("*%strChr%*.pdf") Do (Set "objFileName=%%~nA"
    Call Set "objNewFile=%%objFileName:%strChr%=%%%%~xA"
    Call Echo %%%%objNewFile%%%%=%%objNewFile%%)
Pause

使用完整脚本延迟扩展,(包含!的文件名会出现问题)

@Echo Off
SetLocal EnableDelayedExpansion
Set "strChr=abcd"
For %%A In ("*%strChr%*.pdf") Do (Set "objFileName=%%~nA"
    Set "objNewFile=!objFileName:%strChr%=!%%~xA"
    Echo %%objNewFile%%=!objNewFile!)
Pause

通过切换延迟扩展,(保护包含!的文件名)

@Echo Off
SetLocal DisableDelayedExpansion
Set "strChr=abcd"
For %%A In ("*%strChr%*.pdf") Do (Set "objFileName=%%~nA"
    SetLocal EnableDelayedExpansion
    Set "objNewFile=!objFileName:%strChr%=!%%~xA"
    Echo %%objNewFile%%=!objNewFile!
    EndLocal)
Pause