【问题标题】:String compare with batch file [duplicate]字符串与批处理文件比较[重复]
【发布时间】:2019-07-09 12:41:37
【问题描述】:

一个非常简单的批处理文件。我正在尝试搜索不是 .txt 的文件扩展名。会有一个 .txt,但其余的会像 .txt_20190607。

for %%I in (\\01mtsdv130\Myapp\Log\*.*) do (
    set var1=%%~xI
    echo %var1
    if %var1%==".txt" ( 
       echo Matches
    ) else ( 
        echo does not match 
    )

)

我在该文件夹中有 .txt 文件和扩展名中包含额外日期信息的文件。我有什么问题?

【问题讨论】:

    标签: batch-file environment-variables delayedvariableexpansion


    【解决方案1】:

    代码有两个问题。

    第一个是基于% 的普通变量扩展是相当“静态的”,因为它发生在第一次代码被解析/执行并从那时起被修复。这意味着在第一次循环之后的迭代中,%var1% 的结果将不会改变。你必须使用!var1!(连同设置EnableDelayedExpansion)来获得你想要的行为。

    一个更简单的选择是完全摆脱var1,而只使用%%~xI

    另一个问题是 CMD 将引号(几乎)视为任何其他字符。最值得注意的是,字符串a"a" 不被视为相等。因此,if 应如下所示:

    if "%%~xI"==".txt" (
    

    【讨论】:

    • 感谢 Angew 的快速响应。如果 "%~xI"==".txt" ( 正常工作,但如果 "%var1%"==".txt" ( 没有,则比较变为 "if "" ==".txt"。跨度>
    • 恰恰相反,在批处理文件中,FOR 变量必须与双百分比 %% 取消引用或其他方式一起使用。所以OP做对了那部分。代码的问题是1.通过百分比变量扩展%var%在同一代码块中分配和使用变量,如果无法避免变量访问,则应该使用延迟扩展!var!2.混合引用和未引用正如您在回答中提到的那样,比较字符串。所以if "%%~xI"==".txt" 是正确的。
    • @sst 是的,谢谢您的更正。我确定它只是在声明时是%%,但显然我的记忆欺骗了我(自从上次我不得不做这些事情已经有一段时间了)。
    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多