【问题标题】:Using if conditions at the end of a FOR loop in Batch在批处理中的 FOR 循环结束时使用 if 条件
【发布时间】:2016-12-24 18:33:53
【问题描述】:

我正在处理的批处理文件中有一个简单的 for 循环,但我无法正确扩展变量。整个脚本如下..

setlocal enabledelayedexpansion

set track=0

FOR /f "tokens=2" %%G IN ('find "PhysicalTrackNumber" %1') DO if %track% LSS %%G set track=%%G

echo %track%

echo %1

pause

for 命令提取所有具有物理轨道号的行,我只是想获得最大的数字。 IT 在比较时始终保持为 0。我试过了!!也围绕我的变量,但是脚本似乎做了一些完全不同的事情。我认为它会采用新变量。

将输出与之前的输出进行比较并获得最大的数字时,我缺少什么?

【问题讨论】:

  • 您需要delayed expansion,因为您在像for循环这样的代码块中写入和读取相同的变量...
  • 请告诉我们您是如何尝试使用感叹号为您的变量使用延迟扩展的。
  • {FOR /f "tokens=2" %%G IN ('find "PhysicalTrackNumber" %1') DO (if !track! LSS %%G set track=%%G)} 以上是我添加感叹号的方式。因为那是我想成为最大的价值。但它完全改变了脚本的工作方式,甚至不比较数字,所以我一定做错了,但我不能完全让语法正常工作。
  • 我发现如果使用 !track!,然后我发现我的最终回显输出如何显示 %track% 实际上已成为参数。所以 echo %track% 实际上显示的是 %1 输出

标签: batch-file if-statement for-loop


【解决方案1】:

find "string" filename output 包括

  • 空行;
  • 由 10 个破折号组成的字符串,后跟正在搜索的文件名行;
  • 文件中任何匹配的文本行。

使用skip=2 option(开头要跳过的行数):

FOR /f "skip=2 tokens=2" %%G IN ('find "PhysicalTrackNumber" "%~1"') DO (
    if !track! LSS %%G set "track=%%~G"
)

作为替代方案,使用findstr 代替find

FOR /f "tokens=2" %%G IN ('findstr "PhysicalTrackNumber" "%~1"') DO (
    if !track! LSS %%G set "track=%%~G"
)

【讨论】:

  • 谢谢!!!!我没有抓住最初的空行和导致的问题。我以前不必使用跳过选项,这是一个很好的教训。我最初有 findstr 但出于另一个原因改变了它,我现在看到它没有结果。为了简单起见,我只是使用底部版本,但了解跳过选项确实有很大帮助。
  • @Raxler 如果我的回答有帮助,请考虑将其标记为已接受。 See this page 解释为什么这很重要。
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多