如何在FOR循环中替换变量字符串中的字符?

时间:2015-09-25 14:38:32

标签: batch-file

我有一个名为NonProd.txt的文本文件,每行包含一个服务器名称,即

c123abc
c234abc
c345abc
cfcd123
etc.

我还有一个批处理文件(如下所示),它从文本文件中读取每一行,从每行中提取3个字符,并将该值保存在变量中。然后,我想使用该变量替换XXX变量中的mypath个字符。

以下代码用于读取文本文件,提取服务器名称并提取所需的3个字符,但我无法使字符串替换工作,即将XXX中的mypath替换为@echo off SET mypath=C:\XXX\SYS\exe\folder\folder\ FOR /F %%X IN (NonProd.txt) DO ( echo ServerName = %%X Call Set "SID=%%X" Call Set "SID=%%SID:~1,3%%" Call Echo SID = %%SID%% ECHO mypath = %mypath% CALL set mypath=%mypath:XXX=%SID%% ECHO newpath = %mypath% ECHO. ) @echo Completed. pause 提取了3个字符。

有人可以提供建议吗?

HttpServeltRequest.getServletContext().getRealPath("META-INT/aop.xml");

2 个答案:

答案 0 :(得分:2)

我不明白你使用call而不是enabledelayedexpansion的原因。无论如何,请参阅以下代码:

@echo off
cls
setlocal
(
echo c123abc
echo c234abc
echo c345abc
echo cfcd123
)>%temp%\_file.tmp

set mypath=c:\xxx\sys\exe\folder\folder\
echo:
setlocal enabledelayedexpansion
for /f "delims=" %%a in (%temp%\_file.tmp) do (
    set "sid=%%a"
    rem :: set "sid=!sid:~1,3!"
    set mypath=%mypath:xxx=!sid:~1,3!%
    echo sid: !sid!, servername: !sid:~1,3!, newpath: !mypath!
)
endlocal
echo Completed.
exit /b 0

输出:

  

sid:c123abc,servername:123,newpath:c:\ 123 \ sys \ exe \ folder \ folder \
  sid:c234abc,servername:234,newpath:c:\ 234 \ sys \ exe \ folder \ folder \
  sid:c345abc,servername:345,newpath:c:\ 345 \ sys \ exe \ folder \ folder \
  sid:cfcd123,servername:fcd,newpath:c:\ fcd \ sys \ exe \ folder \ folder \
  已完成。

答案 1 :(得分:1)

使用Aacini建议的延迟扩展的代码。

@echo off
setlocal EnableDelayedExpansion
set "mypath=C:\XXX\SYS\exe\folder\folder\"

for /F %%X IN (NonProd.txt) do (
  echo ServerName = %%X
  set "SID=%%X"
  set "SID=!SID:~1,3!"
  echo SID = !SID!

  set newpath=%mypath:XXX=!SID!%

  echo newpath = !newpath!
  echo.
)

echo Completed.
endlocal
pause

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • for /?
  • if /?
  • set /?
  • setlocal /?

if /?已包含在此列表中,但代码中未使用 IF 作为命令的帮助 IF 解释延迟扩展通常必须在使用( ... )定义的任何块中使用的示例。