2014-02-14 82 views
0

需要使用批處理腳本來抽出兩個XML標記之間的所有字符串。我只想抽出<appSettings></appSettings>之間的字符串。本節上下有許多字符串;需要忽視所有其他字符串。批量複製XML中兩個標記之間的字符串

我試過this解決方案,但因爲我的開始和結束字符串包含'<',我相信會拋出代碼。

例子:

FILE1.TXT(從這個文件中讀取)

::Many lines of code to start with. ~150 lines 
<appSettings> 
    <add key="1" value="False" /> 
    <add key="2" value="False" /> 
    <add key="3" value="False" /> 
    <add key="4" value="False" /> 
    <add key="5" value="False" /> 
    <add key="6" value="False" /> 
    <add key="7" value="False" /> 
    <add key="8" value="False" /> 
    <add key="9" value="False" /> 
    <add key="10" value="False" /> 
    <add key="11" value="False" /> 
    <add key="12" value="False" /> 
    <add key="13" value="False" /> 
    <add key="14" value="False" /> 
    <add key="15" value="False" /> 
    <add key="16" value="False" /> 
    <add key="17" value="False" /> 
</appSettings> 
::Many strings below this ~25 lines 

FILE2.TXT(創建並寫入該文件)

*此文件應創建幷包含來自File1.txt的<appSettings></appSettings>之間的所有字符串

+0

PowerShell是否按批計數? – mojo

+0

嗯,好問題。它需要與預先存在的批處理腳本中的其他命令一起運行,因此可能最好只保留批處理文件 – user3299447

回答

0

下面是使用REPL.BAT - a hybrid JScript/batch utility執行正則表達式搜索和替換標準輸入,並將結果寫入stdout一個非常簡單和快速的解決方案。該腳本是純粹的腳本,可以從XP以後的任何現代Windows機器上本機運行。完整的文檔嵌入在腳本中。

假設REPL.BAT是在當前目錄中,或者更好的是,你的PATH中的某個地方,然後:

type file1.txt|repl "[\s\S]*?<appSettings>([\s\S]*?)</appSettings>[\s\S]*" $1 m >file2.txt 
+0

謝謝dbenham - 我偶然發現了你的repl.bat,我會用這個命令給它一個鏡頭 – user3299447

+0

-Works就像一個魅力;)謝謝 – user3299447

0

只要<appSettings>標籤本身在線,此解決方案應該工作。我試圖考慮無關的空白(標籤外)。該腳本的第一個參數是XML文件。

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 

SET INSIDE_ELT=0 
FOR /F "delims=" %%l IN (%~1) DO (
    SET "LINE=%%~l" 
    SET "LINE=!LINE:<=__-_!" 
    SET "LINE=!LINE:>=_-__!" 
    CALL :STRIP !LINE! 
    SET "LINE=!_STRIPPED:__-_=<!" 
    SET "LINE=!LINE:_-__=>!" 
    IF "!LINE!"=="</appSettings>" SET INSIDE_ELT=0 
    IF "!INSIDE_ELT!"=="1" @ECHO %%l 
    IF "!LINE!"=="<appSettings>" SET INSIDE_ELT=1 
) 


:STRIP 
SET "_STRIPPED=%*" 
EXIT /B 
+0

太好了 - 看起來像是完美的! ECHO正是需要的。現在,我將如何將其導出爲新文件,而不是ECHOing? >> file2.txt?另外,如何將源文件(file1.txt)直接添加到此代碼中,以避免將其作爲參數運行?非常感謝 – user3299447

+0

您可以將命令(或單個echo語句)的輸出傳送到文件,如'@ECHO %% l >> file2.txt'。如果您想要硬編碼輸入文件的名稱,請在'FOR'語句中替換'%〜1'。 – mojo

+0

如果file1.txt與批處理文件(例如setup \ config files \ file1.txt)不在同一個目錄中,那麼我將如何指向那​​裏呢?我試過使用完整路徑(c:\ setup \ config files \ file1.txt)以及(setup \ config files \ file1.txt),引用和不引用路徑中的空間。 – user3299447

0

對於來自Aacini這個任務FINDREPL.BAT是直觀的,也是非常快速和穩健。

這裏是叫findrepl.bat助手批處理文件 - 下載來​​自:https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

findrepl.bat在同一文件夾中的批處理文件或路徑上。

type file1.txt|findrepl /i "<appSettings>" /e:"</appSettings>" >file2.txt 
相關問題