【问题标题】:Counter not incrementing with IF statement inside FOR loop in Windows Batch File在 Windows 批处理文件中的 FOR 循环中,计数器不随 IF 语句递增
【发布时间】:2012-05-04 17:55:54
【问题描述】:

我正在创建的批处理文件中有一个简单的 FOR 循环,但它的工作方式与我期望的不太一样。 FOR 循环遍历文本文件的行,在每次迭代中,我使用 IF 语句对当前行进行快速比较,如果结果为真,则做一些工作。代码如下:

SETLOCAL ENABLEDELAYEDEXPANSION
set /a sitecounts=1
set /a input=34
FOR /F "tokens=1,2 delims=^/" %%G IN (file.txt) DO (
IF %sitecounts% == %input% (set /a selectedsitepath=%logfilepath%W3SVC%%H)
set /a sitecounts=!sitecounts!+1
echo !sitecounts!
)

我遇到了一个奇怪的问题,sitecounts 变量(我的计数器)实际上随着每个循环正确递增(我通过用最后一条语句回显计数来证明这一点)——但是在下一次迭代中,%sitecounts% 仍然显示它的值为 '1',这是初始值。

如果我将代码更改为:

IF !sitecounts! == ...

...那么 IF 语句似乎将该值视为纯文本!我已将 ENABLEDELAYEDEXPANSION 设置为处理循环内的变量,但不确定下一步该做什么。任何帮助表示赞赏!

【问题讨论】:

  • 可能值得学习 PowerShell。 Windows BAT 文件非常有限。
  • 虽然 powershell 可能值得学习,但 Windows 批处理脚本很容易完成这项任务。

标签: windows scripting batch-file


【解决方案1】:

这次我实际测试了一下......

换行

IF %sitecounts% == %input% (set /a selectedsitepath=%logfilepath%W3SVC%%H)

进入

IF !sitecounts! == %input% (set selectedsitepath=%logfilepath%W3SVC%%H)
  • %sitecounts% 必须是 !sitecounts! 才能被评估
  • set /a selectedsitepath=%logfilepath%W3SVC%%H 不起作用,因为它不是数字表达式:

    /A 开关指定等号右边的字符串 是一个被计算的数值表达式。

    只需省略开关(/p 也不起作用,这是为了提示)

【讨论】:

    【解决方案2】:

    可能错误就在这一行

    IF %sitecounts% == %input% (set /a selectedsitepath=%logfilepath%W3SVC%%H)
    

    你设置的是字符串而不是数字表达式(设置/a),然后改为

    IF !sitecounts! == %input% (set   selectedsitepath=%logfilepath%W3SVC%%H)
       ^          ^                 ^
    

    【讨论】:

    • 是的,开关是罪魁祸首,但用/p 替换它不是解决方案:/P 开关允许您将变量的值设置为输入的一行输入由用户进行。 为了将变量设置为字符串值,不需要开关。
    • @marapet 对,刚刚在设置帮助中看到 /a /p 并认为 /p 用于字符串。答案已更新
    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2016-06-04
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多