我有这个脚本:
setlocal EnableDelayedExpansion
set SECTION=dispid 3
set TARGET=pushscope
@echo on
for /F "tokens=1* delims=:" %%a in ('findstr /N /C:"%SECTION%" /C:"%TARGET%" %CHECKER%') do (
if not defined StartSection (
if not %%b==%%b:%SECTION%=% set StartSection=%%a
) else (
goto :EOF
if not defined TargetLine (
goto :EOF :: Do nothing yet
if not %%b equ !%%b:%TARGET%=! set TargetLine=%%a& goto checkercont
)
)
)
在StartSection(问题区域)中,我尝试进行查找和替换以确认此行是我想要的行,并保存该行号。
如何编写它以便正确解析变量并正确查找和替换?
我尝试了什么。 " [%B]"表示替换的%% b:
%%b:%SECTION%=% returns "[%b]:dispid 3=a" (Yes, it somehow gives me an 'a').
!%b:%SECTION%=! returns "!SECTIONa"
!%%b:%SECTION%=! returns "![%b]:dispid 3=!" (which then gives me an error saying 3 is not a command)
!%b:%SECTION%=%! returns "!SECTION!"
!%%b:!SECTION!=! returns "![%b]:!SECTION!=!"
%b:%%SECTION%%=% return "dispid 3" (and error)
我觉得最后一个它解析粗体然后斜体。的%B:% %SECTION%的 的%=% 并使用!似乎永远不会完成任何事情,除了至少有一个回到我身边。
是的,稍等一点之后我就开始在那里投掷随机垃圾(感到沮丧)。
那么正确的方法是什么?
由于
答案 0 :(得分:3)
试试这个:
@ECHO OFF &SETLOCAL
for /F "delims=:" %%a in ('findstr /N /C:"%SECTION%" "%CHECKER%"') do if not DEFINED StartSection set "StartSection=%%a"
IF NOT DEFINED StartSection (ECHO StartSection %section% NOT found&goto:eof)
for /F "delims=:" %%a in ('MORE +%StartSection% "%CHECKER%" ^|findstr /N /C:"%TARGET%"') do if not DEFINED TargetLine set "TargetLine=%%a"
ECHO StartSection at line #%StartSection%
IF NOT DEFINED TargetLine (ECHO TargetLine %target% NOT found) ELSE ECHO TargetLine at line #%TargetLine%
答案 1 :(得分:1)
对不起。我想我不明白你试图通过这条线实现的目标:
if not %%b==%%b:%SECTION%=% set StartSection=%%a
您必须意识到%%b
包含从文件中读取的行,而不是变量!让我们分析一下这个例子:
!%%b:%SECTION%=!
如果%%b
包含变量的名称,则前一行将从中消除SECTION
的值。但是,%%b
不包含变量的名称,而是从文件中读取行!
如果你想检查从文件中读取的行是否包含SECTION给出的字符串,那么你应该这样做:
setlocal EnableDelayedExpansion
set SECTION=dispid 3
set TARGET=pushscope
@echo on
for /F "tokens=1* delims=:" %%a in ('findstr /N /C:"%SECTION%" /C:"%TARGET%" %CHECKER%') do (
if not defined StartSection (
set "line=%%b"
if not "!line!" == "!line:%SECTION%=!" set StartSection=%%a
) else (
. . .
答案 2 :(得分:0)
关于SO的最难回答的问题是"This doesn't work - how do I fix it?"
问题 - 对于所需要的唯一线索是OP承认不起作用的构造......完全按照要求完成淘汰了'水晶球 - 现在维修成本真的吃掉了蝙蝠的翅膀和蜥蜴的舌头预算......
我真的无法弄清楚对双重反转的痴迷是什么。为什么if not condition thingtwo else thingone
?? if condition thingone else thingtwo
有什么问题?也许我只是过时了 - 但也许它在政治上是不正确的或以某种荒谬的方式具有歧视性。
所以 - 在正在审查的情况下,假设期望的结果是确定第一个dispid 3
的亚麻布以及在pushscope
之后出现的包含dispid 3
的行的亚麻布文件%checker%
(其中未提供样本......)
@ECHO OFF
SETLOCAL
set SECTION=dispid 3
set TARGET=pushscope
SET checker=sourcefile.txt
SET startsection=
SET targetline=
for /F "tokens=1* delims=:" %%a in ('findstr /N /C:"%SECTION%" /C:"%TARGET%" %CHECKER%') do (
IF DEFINED startsection (
IF NOT DEFINED targetline (
ECHO %%b|FIND "%target%">NUL
IF NOT ERRORLEVEL 1 SET targetline=%%a
)
) ELSE (
ECHO %%b|FIND "%section%">NUL
IF NOT ERRORLEVEL 1 SET startsection=%%a
)
)
ECHO startsection=%startsection% targetline=%targetline%
GOTO :EOF
哪个适合我。 YMMV。