2012-04-05 83 views
0

我有简单的文件看起来像:批迭代FOR/F变量

Submit.log

Submitting job(s).. 
2 job(s) submitted to cluster 528. 
Submitting job(s).. 
2 job(s) submitted to cluster 529. 

然后我需要输出只从第二行(集群)的最后一个数字,在这种情况下所需的输出将是:

528 
529 

我试过使用下面的脚本,但我不知道它为什么不工作。我需要使用批量处理,这是我们系统的限制。

@ECHO OFF 
FOR /F "tokens=6" %%g IN (Submit.log) DO (
set Job=%%g 
echo %Job:.=% 
) 

优雅的解决方案将明确加分,但如果有人可以帮助我用一个简单的解决方案,我将不胜感激。

回答

1

这是一个工作班轮。 FINDSTR搜索可以很容易地进行调整,使搜索非常精确。

@echo off 
for /f "tokens=6 delims=. " %%N in ('findstr /c:"submitted to cluster" "submit.log"') do echo %%N 

的paxdiablo溶液可以被简化,以及因此,它不需要修改值为此它不需要延迟扩展。没有必要捕获所有的令牌,只需要使用那些令牌。分隔符设置为查找点和空格(默认值是空格和制表符)。正如paxdiablo所说,可以测试更多标记以使搜索更精确,但这不如FINDSTR那么方便。

@echo off 
for /f "tokens=5,6 delims=. " %%A in (submit.log) do if %%A==cluster echo %%B 
1

下面的脚本将做的工作:

@setlocal enableextensions enabledelayedexpansion 
@echo off 
for /f "tokens=1-6" %%a IN (submit.log) do (
    if %%c==submitted (
     set job=%%f 
     echo !job:.=! 
    ) 
) 
endlocal 

而且,因为我基本上是温和的类型,我会停下来短暂竞争,它是既优雅简单:-)

它基本上只查看第三个字是submitted的那些行(如果证明存在问题,您还可以使用其他规则),然后修改并输出第六个字。

请注意延迟扩展的使用(使用!而不是%)需要确保在循环开始之前不对变量进行评估。

+0

我不知道延迟扩展的事情。谢谢一堆! – Mac 2012-04-05 03:26:25