如何在FOR循环中替换字符串中的字符?
问题描述:
我有称为NonProd.txt每行包含一个服务器名称的文本文件,即如何在FOR循环中替换字符串中的字符?
c123abc
c234abc
c345abc
cfcd123
etc.
我也有一个批处理文件(以下给出),其读取从文本文件中的每一行,提取3个字符从每一行,并将该值保存在变量中。然后我想用变量替换mypath
变量中的XXX
字符。
下面的代码用于读取文本文件,提取服务器名称并提取它需要的3个字符,但是我无法使字符串替换工作,即用取出的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
答
使用延迟扩展的代码,如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代码不被用作命令的帮助,如果解释延迟Ë xpansion上的示例经常必须用于任何使用(
定义的块... )
。
答
我不明白你为什么用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,服务器名称:123,NEWPATH:C:\ 123 \ SYS \ EXE \文件夹\文件夹\
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 \
已完成。
您需要DelayedExpansion:'呼叫建立mypath中= %% mypath中:!XXX = SID %%'和'也叫ECHO NEWPATH = %% mypath中%%' – Aacini
这也可以不DelayedExpansion(未经测试)工作= 'CALL CALL set mypath = %%%% mypath:XXX = %% SID %%%%%%'' – Aacini