我尝试使用批处理文件从文件设置变量(假设,filehash是变量名)。唉,我遇到了这两个问题:
当它包含特殊字符时,尤其是感叹号,因为我使用enableDelayedExpansion。
在执行此操作时,我需要将&
更改为&同样。
我已尝试过各种来源提供的多种解决方案,但没有一种能满足我的要求。
这是我目前的代码:
@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
我希望我能正确地传达我的问题,并提前感谢你!
答案 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
命令将&
替换为&
。