问题描述
我有字符串photo="999" price="10" category="1"
。我只想得到10
。这意味着我需要以price =“开头并以”
@For /F "Tokens=1*Delims==" %%A In ('FindStr /I "^price=" "C:\price.txt" 2^>NUL')Do @Set "Ver=%%~B"
@Echo(%%Ver%% = %Ver% & Pause
解决方法
findstr
总是(如果成功)返回完整行。因此,它不是完成此任务的正确工具(实际上,cmd
中根本没有任何工具可以做到这一点)。
但是有一点逻辑,您可以解决该问题:从头开始删除该部分,直到(包括)触发词price
(执行任务,set
命令很高兴),然后使用for /f
循环处理其余部分,以获得所需的子字符串:
set "string=photo="999" price="10" category="1""
echo check: %string%
echo debug: %string:*price=%
for /f tokens^=2^ delims^=^" %%a in ("%string:*price=%") do set "ver=%%~a"
echo ver=%ver%
如果您确定字符串的确切格式(在您的示例中,搜索到的子字符串是用引号引起来的第二个参数,那么当用"
分割时,第四个标记就变得很简单:
for /f tokens^=4^ delims^=^" %%a in ("%string%") do echo ver=%%~a
或
for /f tokens^=4^ delims^=^" %%a in (file.txt) do echo ver=%%~a
,
这是一个示例,尝试遵循与示例代码类似的方法。
它使用FindStr
隔离C:\price.txt
中的任何行,其中包括单词price="<OneOrMoreDigits>"
。该行保存为名为price
的变量,该变量在嵌套扩展For
的循环扩展中进行延迟扩展,以删除所有内容,包括字符串 price
的第一个实例,在这种情况下,留下="10" category="1"
。嵌套循环进一步将其拆分为第二个令牌,使用双引号字符作为分隔符(应为您所需的值)。
@For /F Delims^=^ EOL^= %%G In ('%__AppDir__%findstr.exe /IR "\<price=\"[0123456789]*\"\>" "C:\price.txt"') Do @(Set "price=%%G" & SetLocal EnableDelayedExpansion
For /F Tokens^=2^ Delims^=^" %%H In ("!price:* price=!") Do @EndLocal & Set "price=%%H")
@Echo %%price%% = %price% & Pause
,
@ECHO OFF
SETLOCAL
set "string=photo="999" price="10" category="1""
:: remove quotes
set "string=%string:"=%"
for /f %%a in ("%string:* price=%") do set /a pricefound%%a
set pri
goto :eof
由于我们没有代表性的文件样本,因此我们不得不得出这样的结论:要求是在文件中找到 price="anumber"
的唯一外观。
因此,由于正确构架的findstr
输出将选择此行,因此我们所需要做的就是处理字符串。
这是一种快捷方法。可能足以满足OP的目的。
首先,请删除字符串中的引号,因为它们有干扰的习惯。
接下来,在字符串处理模式下使用for /f
,在括号内用引号引起来的字符串处理魔术。该字符串是原始字符串,减去引号,因此将所有不超过“ Space price”的字符替换为 nothing ,并获取结果的第一个标记,得到{{1 }}在示例情况下分配给=10
。
然后只需将两个字符串连接起来即可执行“设置/ a somevariablename %%a
”。
请注意,如果文件中包含=10
之类的行,则可能需要采取其他措施。
很显然,您需要匹配包含price="
的行,因为可能还有其他行。
不清楚是您需要完全匹配10
,还是只是希望它是任意数字。
您似乎只想匹配任意数字并抓住它。
这很容易做到:
@For /F "Tokens=4 Delims=^= " %%A In ('
TYPE "C:\price.txt" ^| FIND /I "price="""') Do @(
Set "Ver=%%~A" & CALL SET Ver &Pause )
虽然您需要匹配Price="10"
,这似乎没什么用,但是至少有一个人理解了这个意思,您的措词还不清楚,所以我补充一下:
@For /F "Tokens=4 Delims=^= " %%A In ('
TYPE "C:\price.txt" ^| FIND /I "price=""10"""') Do @(
Set "Ver=%%~A" & CALL SET Ver &Pause )
请注意,在所有示例中,我都留在@
符号中,因为我认为这很聪明,在您要调试某些特定代码时,请离开ECHO ON
并仅删除@
符号你在做什么。
但是,如果不是这样,则需要指出的是,在脚本中通常最容易将ECHO OFF
放在脚本的开头,而不是在每个语句的开头放置@
来停止从回声。
干杯! :)