2012-06-20 49 views
0

好吧,atm腳本我正在編寫一個腳本,它從幾個文本文件中提取值,但似乎找不到將文件合併到單個文本文件的好方法。Windows批量高級文本查找功能

FOR /f "tokens=%toknum% delims=:" %%G in ('"find /v /c "" "%~dp0\!systype!Win7Updates.txt""') do set maxcnt=%%G 

在文本文件中:

KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 

我試圖找出如何在一個文件中創建一個區域,因此將分開的東西。我想嘗試找到標題,轉到標題並在它下面進行翻轉將被加載。

我想要做的例子。 (也試圖在CSV文件中做到這一點)所以我想腳本找到Windows Vista的補丁區域,只加載該區域下面的。任何人都知道這是可能的嗎?

:Windows 7 Patches 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 

:Windows Vista Patches 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart 

回答

1

您的聲明「下面的所有內容都將被加載」不清楚。我認爲你的意思是低於標題直到下一個標題。我真的不知道你的意思是「加載」 - 也許將這些行追加到另一個文件?對於這個解決方案,我會簡單地迴應這些線條

您的測試案例非常糟糕 - 部分內容相同,因此很難判斷代碼是否正常工作。這是一個更有趣的測試案例,應該更易於解釋。我添加了一些!字符來說明使用FOR循環時延遲擴展的問題。

的test.txt

:Windows 7 patches 
Windows 7 line 1! 
Windows 7 line 2! 
Windows 7 line 3! 

:Windows Vista patches 
Windows Vista line 1! 
Windows Vista line 2! 
Windows Vista line 3! 

:Windows XP patches 
Windows XP line 1! 
Windows XP line 2! 
Windows XP line 3! 

這裏是一個批處理腳本,將呼應只是Vista的補丁部分。它在循環內切換延遲擴展和關閉以保護!。如果延遲擴展,%% A的擴展將無法正常工作。

@echo off 
setlocal disableDelayedExpansion 
for /f "delims=:" %%N in ('findstr /n /c:":Windows Vista patches" test.txt') do set skip=%%N 
for /f "skip=%skip% delims=" %%A in (test.txt) do (
    set ln=%%A 
    setlocal enableDelayedExpansion 
    if "!ln:~0,1!"==":" (endlocal & goto :break) 
    endlocal 
    echo %%A 
) 
:break 

上述解決方案將去除所有空白行。如有需要,有技巧可以保留空行。由於默認的FOR/F「EOL」選項,它也將去除以;開頭的所有行。如果需要,還有一些技巧可以解決這個問題。

+0

我的意思是「加載」是第一段代碼顯示即時通訊從線路中獲取切換,這是我如何加載所有信息。 – user1451070

+0

@ user1451070 - 仍然清晰如泥。你的評論說你是「從線路切換」,我可以用多種方式來解釋。您問題中的代碼只是計算文本文件中的行數。我沒有看到連接。嘗試編輯您的問題以顯示您期望的結果。 – dbenham

+0

文本文件有「開關」,用逗號分隔 – user1451070