解析从文件到变量的for循环中的特殊字符

时间:2017-10-24 08:16:30

标签: windows batch-file

我尝试使用批处理文件从文件设置变量(假设,filehash是变量名)。唉,我遇到了这两个问题:

  1. 当它包含特殊字符时,尤其是感叹号,因为我使用enableDelayedExpansion。

  2. 在执行此操作时,我需要将&更改为&同样。

  3. 我已尝试过各种来源提供的多种解决方案,但没有一种能满足我的要求。

    这是我目前的代码:

    @echo off
    set grep=binaries\grep.exe
    set fileindex=binaries\index.htm
    set count=0
    for /f "tokens=* delims=" %%a in (crc.dat) do ( 
    set count=!count! + 1
    set filehash=%%a
    %grep% --ignore-case -w "!filehash!" %fileindex%>> list.dat
    )
    

    以及crc.dat文件中的内容示例:

    Kabooom! Kablooey!
    Kaboom & Kablooey
    

    使用我在list.dat中的当前代码的结果:

    Kabooom Kablooey
    Kaboom & Kablooey
    

    我在list.dat中期待的结果:

    Kabooom! Kablooey!
    Kaboom & Kablooey
    

    我希望我能正确地传达我的问题,并提前感谢你!

2 个答案:

答案 0 :(得分:1)

要在&输入中将&替换为grep,请使用:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "grep=binaries\grep.exe"
set "fileindex=binaries\index.htm"
set "file=crc.dat"
set "list=list.dat"

rem // Initialise counter:
set /A "count=0"
> "%list%" (
    for /F "usebackq delims=" %%a in ("%file%") do (
        rem // Increment counter:
        set /A "count+=1"
        rem // Assign line string to variable:
        set "lineitem=%%a"
        rem // Toggle delayed expansion:
        setlocal EnableDelayedExpansion
        rem // Do sub-string replacement:
        set "lineitem=!lineitem:&=&!"
        rem // Execute `grep` command line:
        "!grep!" --ignore-case -w "!lineitem!" "!fileindex!"
        endlocal
    )
)
rem // Return counter:
echo/%count%

endlocal

要在&输出中将&替换为grep,请使用:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "grep=binaries\grep.exe"
set "fileindex=binaries\index.htm"
set "file=crc.dat"
set "list=list.dat"

rem // Initialise counter:
set /A "count=0"
> "%list%" (
    for /F "usebackq delims=" %%a in ("%file%") do (
        rem // Increment counter:
        set /A "count+=1"
        rem // Execute `grep` command line and capture its output by `for /F`:
        for /F "delims=" %%b in ('^""%grep%" --ignore-case -w "%%a" "%fileindex%"^"') do (
            rem // Assign `grep` output to variable:
            set "lineitem=%%b"
            rem // Toggle delayed expansion:
            setlocal EnableDelayedExpansion
            rem // Do sub-string replacement:
            set "lineitem=!lineitem:&=&!"
            rem // Return modified string:
            echo(!lineitem!
            endlocal
        )
    )
)
rem // Return counter:
echo/%count%

endlocal

通常,要处理带有感叹号的字符串,您必须切换延迟扩展,以便正常% - 扩展变量和for变量引用(如%%a)会因扩展禁用延迟扩展而扩展

答案 1 :(得分:0)

此解决方案为delayedExpansion - 免费且能够将&替换为&

@echo off
set grep=binaries\grep.exe
set fileindex=binaries\index.htm
set count=0

for /f "tokens=* delims=" %%a in (crc.dat) do ( 
    set /a count+=1
    %grep% --ignore-case -w "%%a" %fileindex%>>temp.dat
)
powershell -Command "(gc temp.dat) -replace '&', '&' | sc list.dat"
del /f temp.dat
pause
exit /b

有些改变了一些事情:

  • set /a count+=1 = set /a count=%count%+1
    • !fileHash!指向%%a,为什么我们需要它? %%a将有效。
  • powershell命令将&替换为&
  • 将替换的内容输出到文件中。
  • 删除使用的临时文件。