Windows 如何格式化for循环中的find-replace变量
我有这个剧本:Windows 如何格式化for循环中的find-replace变量,windows,batch-file,Windows,Batch File,我有这个剧本: 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:%SECTIO
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%%%%=%%
和使用!除了向我展示至少一个,我似乎从未完成任何事情
是的,过了一会儿,我就开始往里面乱扔垃圾(很沮丧)
那么,怎样才能让这一切正常运转呢
谢谢最难回答的问题是
“这不起作用-我该如何修复它?”
问题-这里需要的唯一线索是OP承认不起作用的结构。。。对所需物品的预测会使水晶球磨损,而如今的维修费用会消耗蝙蝠翅膀和蜥蜴舌头的预算
我也真的搞不懂为什么痴迷于双反转。为什么如果不是条件,那么两个其他的条件是一个
??如果条件项为一项或两项,则有什么问题?也许我只是个守旧的人——但也许这在政治上是不正确的,或者以某种荒谬的方式具有歧视性
因此-在正在检查的情况下,假设所需结果是确定文件%checker%
中第一个dispid 3
的行号以及包含pushscope
的行的行号,该行号出现在%checker%
文件中的dispid 3
之后(未提供样本…)
这对我很有用。YMMV.最难回答的问题是“这不起作用-我该如何修复它?”
问题-其中唯一需要的线索是OP承认不起作用的结构。。。对所需物品的预测会使水晶球磨损,而如今的维修费用会消耗蝙蝠翅膀和蜥蜴舌头的预算
我也真的搞不懂为什么痴迷于双反转。为什么如果不是条件,那么两个其他的条件是一个
??如果条件项为一项或两项,则有什么问题?也许我只是个守旧的人——但也许这在政治上是不正确的,或者以某种荒谬的方式具有歧视性
因此-在正在检查的情况下,假设所需结果是确定文件%checker%
中第一个dispid 3
的行号以及包含pushscope
的行的行号,该行号出现在%checker%
文件中的dispid 3
之后(未提供样本…)
这对我很有用。YMMV.试试这个:
@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%
试试这个:
@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%
对不起。我想我不明白你用这句话想达到什么目的:
if not %%b==%%b:%SECTION%=% set StartSection=%%a
您必须意识到%%b
包含从文件中读取的一行,而不是一个变量!让我们分析一下这个例子:
!%%b:%SECTION%=!
如果%%b
包含变量名,则前一行将从中删除部分的值。但是,%%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 (
. . .
对不起。我想我不明白你用这句话想达到什么目的:
if not %%b==%%b:%SECTION%=% set StartSection=%%a
您必须意识到%%b
包含从文件中读取的一行,而不是一个变量!让我们分析一下这个例子:
!%%b:%SECTION%=!
如果%%b
包含变量名,则前一行将从中删除部分的值。但是,%%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 (
. . .
else(goto:EOF如果没有定义…)
你确定吗?它是用来调试的,你可以忽略它-它是一个大的批处理文件,因此跳到最后会更快地给我结果else(goto:EOF如果没有定义…)
你确定吗?它是用来调试的,你可以忽略它-它是一个大的批处理文件,因此,跳到最后给了我快速的结果。我不理解你的第一段。我不只是给我的脚本,并说修复它。我陈述了问题所在,我试图用这句话完成什么,以及我尝试过的解决方案。如果你想重写代码,那是你的特权。我不理解你的第一段。我不只是给我的脚本,并说修复它。我陈述了问题所在,我试图用这句话完成什么,以及我尝试过的解决方案。如果你想重写代码,那是你的特权。只是看看,这是行不通的。原因是StartSection将设置在第1行,然后TargetLine将变为第2行。总是。因此,我正在进行查找替换,以确保StartSection是我想要的字符串。从那里,目标的下一次出现将是所需的行。我的方法很好-只需要找出查找替换部分。代码假设,部分
在目标
之前,并且在第一行和目标
之间没有额外的部分
字符串。对不起,我不确定我在想什么。但目标在节之前出现多次。提供时,StartSection将设置为目标,而不是节。(请注意搜索中的两个参数)。因此,在设置StartSection之前需要验证行中是否包含节。为了澄清这一点,您的脚本假定节始终位于目标之前,但是,目标出现了数百次,而节只出现了1次。