批处理文件使用 if 语句忽略环境变量

Posted

技术标签:

【中文标题】批处理文件使用 if 语句忽略环境变量【英文标题】:Batch File ignores environment variables with if statement 【发布时间】:2017-04-21 11:01:01 【问题描述】:

我有以下批处理文件。基本上,它会扫描具有相同名称但扩展名不同 *.TXT 和 .AVI 的文件的导向器。 如果AVI文件名对应的Text文件名存在,则不播放AVI文件。否则它应该由指定的应用程序播放。 似乎环境变量是循环和if之间的问题。 我已经阅读了几乎所有与环境变量有关的批处理文件的相关文章。他们都没有工作。我也尝试过启用和不启用 EnableDelayedExpansion,但没有运气。也试过 == 而不是 EQU 但没有运气。所有 Echo 语句都用于调试。 这是我的尝试。

@echo off

SetLocal EnableDelayedExpansion

SET  MyApp="C:\Program Files\VideoLAN\VLC\vlc.exe"
ECHO MyApp is %MyApp%

SET PathToDB=C:\1
ECHO PathToDB is %PathToDB%


FOR %%X in (%PathToDB%\*.avi) DO (

    ECHO  Q.  %%X  

    SET ABC=YES 

    IF EXIST "%PathToDB%\%%~nX.txt" (

        ECHO Coressponding Text File Exists ....[%%~nX.txt]....

        SET  ABC=[NO]
    )


    ECHO  1  %ABC%
    ECHO  1  !ABC!

    if !ABC! EQU "YES"    %MyApp%      %%X
    if !ABC! EQU "YES"    !MyApp!      %%X

)

感谢任何有用的建议

【问题讨论】:

你是说问题出在最后一个 if 语句吗?? 尽管变量 ABC 的值为 YES,但代码中的最后两个 if 语句似乎未正确评估 此评论应与已经提供的答案一起阅读。如果您查看您的行,它显示为SET ABC=YES ,如果我将其放在引号中,则显示为SET "ABC=YES "。现在您应该可以看到您的问题了。 帮助阅读您尝试使用的命令的帮助文件。 【参考方案1】:

您应该仅将EQU 用于数值比较。因为您正在比较文本,所以您应该使用 ==,但请记住:左侧的整个文本(每个字符)必须与右侧的整个文本相同 == 运营商。 IF 语句 if !ABC! == "YES" %MyApp% %%X 中的条件永远不会计算为真,因为右侧部分包含双引号 " 而左侧部分不包含。所以应该是:

if "!ABC!" == "YES"    %MyApp% %%X

【讨论】:

以上是关于批处理文件使用 if 语句忽略环境变量的主要内容,如果未能解决你的问题,请参考以下文章

批处理文件中的变量和 if 语句存在问题[重复]

批处理文件 - IF 语句问题

在 DOS 6.22 批处理文件中忽略 IF EXIST ELSE 的问题

批处理循环语句 ?

使用 if 语句后跟调用似乎在批处理文件中不起作用

WinSCP 命令中的批处理文件 IF 语句语法