使用 windows 批次在占位符中插入值

Insert value in place holders using windows batch

我有一条线

Removing,policy,NULL,from,group,NULL

我想在第一个 NULL 处插入 abc,在第二个 NULL 处插入 xyz。 我从早上开始就在敲我的头,但仍然不知道该怎么做。有人可以建议吗?

不知道线路是怎么获取的,直接用:

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 循环中进行的,您将需要延迟扩展,因为我怀疑是这种情况。

如果您可以控制占位符的格式,那么我建议改用延迟扩展变量。然后您可以使用 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 变量而不是简单地使用不带 FOR 的 %var% 的原因是为了处理 |< 等有毒字符的可能性等在文本中,可能有或没有引号。延迟扩展和 FOR 变量使我不必担心转义或引用内容。仅有的两个例外是可能存在的 ^! 文字。保留它们的最简单方法是将它们也编码为延迟扩展变量。

此方法假设先前不知道输入行中要替换的值的format/position:

@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 ( 命令中的延迟扩展来扩展它。