BATCH:如何在for循环中正确使用%%变量

时间:2017-04-03 14:07:18

标签: batch-file

这是我第一次尝试批量编写脚本,所以请耐心等待。

我只是想读取我的hosts文件的每一行,如果它包含/匹配子字符串,则替换该行。我在这里看到了很多关于子串的回答问题但是我无法通过使用提供的解决方案使其工作。

我有这段代码:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "hostspath=%SystemRoot%\System32\drivers\etc\hosts"
set "hostsbackuppath=c:\hosts"

>"%hostsbackuppath%.new" (
    rem Parse the hosts file, skipping the already present hosts from our list.
    rem Blank lines are preserved using findstr trick.
    for /f "delims=: tokens=1*" %%a in ('%SystemRoot%\System32\findstr.exe /n /r /c:".*" "%hostspath%"') do (

set str1=%%b
    if not x!str1:mydomainname=!==x!str1! (
      rem Match found, replace this line.
      echo "match!"
      set matched=false
    )
    // Didn't match, do not replace
    if not "!matched!"=="true" echo.%%b

    )

)

我正在尝试使用此解决方案检查子串匹配以及其他:Batch file: Find if substring is in string (not in a file)

有人能帮助我吗?感谢

1 个答案:

答案 0 :(得分:0)

SETLOCAL ENABLEDELAYEDEXPANSION
set "matched=true"
>"%hostsbackuppath%.new" (
  for /f "delims=: tokens=1*" %%a in ('%SystemRoot%\System32\findstr.exe /n /r /c:".*" "%hostspath%"') do (
    set "str1=%%b"
    if not "!str1:mydomainname=!"=="!str1!" (
      rem Match found, replace this line.
      echo "match at %%b in line %%a"
      set matched=false
    )
    // Didn't match, do not replace
    if not "!matched!"=="true" echo.%%b
  )
)

胡利-杜利!有人需要学会恰当地命名变量。

首先,您需要使用setlocal enabledelayedexpansion - 请参阅有关delayed expansion的一千零一篇SO文章。

由于str1在循环内变化,您需要使用setlocal enabledelayedexpansion!var!来访问var的变化值,因为%var%是值在遇到for时。

语法SET "var=value"(其中value可以为空)用于确保任何杂散尾随空格不包含在分配的值中。 set /a可以安全地使用“无报价”。

出于同样的原因,引用比较的每一边都是首选,因为它会生成包含空格分隔符的字符串的单个标记。

然后你有一个评论“匹配找到”,之后你将matched设置为 false ??因此,您需要初始化match(至 true

现在你要做的就是晦涩难懂。在重新阅读时,您可能希望将set "matched=true"作为循环中的第一行,而不是我所拥有的那一行,以便对于找到的每一行将该值重新设置为true,然后设置如果找到匹配则为false。

所有这些消极逻辑都是疯狂的。我需要一杯浓咖啡。