使用Windows批处理将值插入到占位符中

时间:2015-04-28 09:11:50

标签: batch-file cmd

我有一条线

Removing,policy,NULL,from,group,NULL

我想在第一个NULL处插入abc,在第二个NULL处插入xyz。 我从早上开始敲打我的脑袋,但仍无法弄清楚该怎么做。有人可以建议吗?

3 个答案:

答案 0 :(得分:1)

我不知道如何获取该行,所以我将直接使用它:

setlocal enableDelayedExpansion
set  "line=Removing,policy,NULL,from,group,NULL"
for /f "tokens=1-6 delims=," %%a in ("%line%") do (
    set "new_line=%%a,%%b,abc,%%d,%%e,xyz"
)
echo !new_line!

如果在另一个FOR循环中进行此操作,您将需要延迟扩展,因为我怀疑是这种情况。

答案 1 :(得分:1)

如果您可以控制占位符的格式,那么我建议使用延迟扩展变量。然后,您可以使用FOR / F循环进行替换,因为在FOR变量扩展之后会发生延迟扩展。

@echo off
setlocal enableDelayedExpansion

:: Define the line with variable place holders
:: Quoted ! literal must be escaped as ^! when delayed expansion is enabled
set "var=Removing,policy,^!val1^!,from,group,^!val2^!"

:: Show the starting value
echo var=!var!

:: Define the replacement values
set "val1=abc"
set "val2=xyz"

:: Perform the substitution
for /f "delims=" %%A in ("!var!") do set "var=%%A"

:: Show the result
echo var=!var!

我使用延迟扩展将值转移到FOR变量而不是仅使用%var%而不使用FOR的原因是为了处理|<等毒字符的可能性在文本中,可能有或没有引号。延迟扩展和FOR变量使得我不必担心转义或引用内容。唯一的两个例外是可能存在的^!文字。保留它们的最简单方法是将它们编码为延迟扩展变量。

答案 2 :(得分:0)

此方法假定之前不知道要在输入行中替换的值的格式/位置:

@echo off
setlocal EnableDelayedExpansion

rem Define the replacement values
set insert[1]=abc
set insert[2]=xyz

set "line=Removing,policy,NULL,from,group,NULL"

echo Before: %line%
set i=0
set "out="
for %%a in (%line%) do (
   if %%a equ NULL (
      set /A i+=1
      for %%i in (!i!) do set "out=!out!,!insert[%%i]!"
   ) else (
      set "out=!out!,%%a"
   )
)
set "line=%out:~1%"

echo After:  %line%

如果在FOR循环内生成该行,只需通过for %%a in (!line!) do (命令中的延迟扩展来扩展它。