命令行如何将字符串搜索到 %% 变量中

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
    )
)

【讨论】:

以上是关于命令行如何将字符串搜索到 %% 变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Windows 命令行永久更新 PATH 变量?

将CMake变量从GUI导出到命令行

如何将变量作为标准输入从 PHP 传递到命令行

Linux脚本基础

将字符串拆分(不解析)到命令行参数 C# [重复]

安装完MYSQL后使用命令行运行mysqld提示mysqld不是内部或外部命令