命令行如何将字符串搜索到 %% 变量中
Posted
技术标签:
【中文标题】命令行如何将字符串搜索到 %% 变量中【英文标题】:Command line how to search a string into a %% variable 【发布时间】:2019-12-06 13:27:27 【问题描述】:我有一个包含文件名规范的文本文件,格式如下,filename-yyyymmdd
source.txt
IMG-20190601
IMG-20190602
IMG-20190603
...
我想阅读此文件,以便将日期与参考日期进行比较,并根据结果执行一些操作。 IMG
总是一样的,只是日期在变。
为此,我试图在我正在阅读的每一行中找到文件名日期,以便与今天进行比较。
我没有成功找到正确的语法,我发现提取子字符串可以用
set SUBSTRING=%VAR:~POSITION,SIZE%
但它不适用于%%variable
类型。
欢迎任何帮助。
我的代码:
set comparedate=20190702
set /A i=0
for /F "usebackq delims=" %%a in (source.txt) do (
set /A i+=1
rem call echo %%i%%
rem call echo %%a
set datefile=%%a:~4,8 # the line that is not working
if %datefile% geq %comparedate% (goto here) else (goto there)
:here
echo do something
:there
echo do something else
)
【问题讨论】:
but it is not working with %% variable type.
。是的,这是正确的(按设计)。您需要先将%%x
变量转换为“正常”%var%
变量,然后才能进行子字符串处理。当然,您需要delayed expansion (!var:~4,8!
) 才能使其在代码块中工作。
您能看出%VAR:~POSITION,SIZE%
和%%a:~4,8
之间的区别吗?它们都是不同类型的变量,但只能扩展和修改其中的一个。您需要先将后者变为前者,即Set "VAR=%%a"
。我还强烈建议您在尝试修改和使用代码块中的变量内容之前启用延迟扩展。
请告诉我们source.txt
的实际格式。按照现在的情况,:~4,8
将提取字符串 filename
循环中的任何goto
都会中断循环(例如,它只会处理第一行)。使用call
而不是goto
避免这种情况。并将您的标签(子程序)放在循环之外。
感谢两位的回答。它通过使用带有双引号的 set "VAR=%%a" 来工作。没有它是行不通的。最好的:)
【参考方案1】:
在您的代码中实施了我从 cmets 提出的建议。还通过直接使用标记来避免延迟扩展(以及从文件名中获取日期字符串的另一种方法(通过在连字符处拆分)):
@echo off
set comparedate=20190702
set /A i=0
for /F "tokens=1,* delims=-" %%a in (source.txt) do (
ECHO FileDate=%%b
ECHO FileName=%%a-%%b [in case you need it]
if "%%b" geq "%comparedate%" (
echo do something
) else (
echo do something else
)
)
【讨论】:
以上是关于命令行如何将字符串搜索到 %% 变量中的主要内容,如果未能解决你的问题,请参考以下文章