2012-04-05 71 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