2012-02-20 22 views
1

我一直在這個問題上停留了一段時間,並且在幫助網站上查找如何批量編程只會讓我更加困惑。在批處理文件中分支程序輸出

上下文是我想識別文件夾中的哪些文件是xml有效的,並將所有無效文件附加到特定文件以供進一步處理。

這樣做我已經使用xmlstarlet並使用下面的命令我已經能夠識別哪些是有效的,並將輸出管道輸出到我的批處理文件。現在

xml val *.xml | myscript.bat 

,我想要做的是找出哪些是有效的,爲了做到這一點我需要解析的xml.exe其輸出如下:

20100319.xml - valid 
20090915.xml - valid 
20090915.xml - valid 
20090915.xml - valid 
20090915.xml - invalid 

那麼什麼實際上,我需要在每一行上分支來查看最後7個字符是否「無效」,如果是,請將xml文件附加到我的結果文件中。

試着這樣做,我建立了你將在下面找到的腳本。

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 

for /F "tokens=*" %%a in ('more') do (
set full=%%a 
set /p prefix=!full:~-7! 
if %prefix% == "invalid" (type %%a result.xml) else (echo "valid file") 
) 

現在是特定於我的問題首先我得到的錯誤

(type was unexpected at this time. 

然後,如果我刪除if分支和echo %prefix%取代它,我得到這樣的輸出:

- validECHO is off. 
- validECHO is off. 
- validECHO is off. 
- validECHO is off. 
invalidECHO is off. 

你能幫我創建一個分支,將XML文件附加到我的結果文件並擺脫ECHO關閉?打開@ECHO off,導致將代碼本身打印到屏幕上。

感謝您的幫助!

亞歷

+0

您應該刪除'/ p'在'設置/ P PREFIX =全:!〜-7',你如果要更改%'前綴%==「invalid」(類型%%結果...「if」前綴!「==」無效「(echo %% a> result.xml)else(echo」有效文件「) – jeb 2012-02-20 12:56:17

+0

'ECHO關閉'的答案在'set /?'-delayed擴展 – jeb 2012-02-20 12:58:04

+0

中描述。另外,需要使用附加形式的重定向:'>> result.xml' – dbenham 2012-02-20 14:41:16

回答

0

由於圖案爲「FILENAME - RESULT」您可以使用FOR循環,分在白色空間中,使得%%a=FILENAME%%B=-%%C=RESULT

for /F "tokens=1,2,3 delims= " %%a in ('more') do (
    if "%%c" neq "valid" (
     echo %%a is invalid [%%c] 
     echo %%a >> result.xml 
    ) else (
     echo %%a is valid 
    ) 
) 

不確定type %%a result.xml,我不我認爲這是一個有效的命令。

echo %%a >> result.xml將追加的文件名來爲result.xml

+0

此答案假定沒有任何文件名包含空格。它會失敗的任何名稱,包含空間。 – dbenham 2012-02-20 14:30:19

1

傑布診斷,並在他的意見解決你的問題(只要你改變>result.xml>>result.xml)。亞歷克斯K.答案是好的,但它只會工作,如果你可以保證文件名不包含空格。

但有一個更簡單快捷的解決方案:使用FINDSTR過濾「xml.exe」的結果,只保留以「無效」結尾的行。我認爲命名輸出文件result.xml並不是一個好主意,因爲內容不是xml格式。我將輸出文件重命名爲「invalidXML.txt」。

xml val *.xml | findstr /e "invalid" >invalidXML.txt 

上述假定「xml.exe」產生終止與<CR><LF>有效的Windows風格的線條。如果情況並非如此,那麼「xml。與<Lf>終止EXE」產生UNIX風格的線條,然後使用更多的轉換到Windows風格。

xml val *.xml | more | findstr /e "invalid" >invalidXML.txt 

要獲得有效的文件列表,你可以使用(如果需要的話再添加更多)

xml val *.xml | findstr /e "- valid" >validXML.txt 

上面在每行末尾保留了「 - 無效」或「 - 有效」指示符,就像您的原始代碼一樣(調試過一次),而且它不需要批處理文件:)

如果你想要輸出像Alex K.建議的(僅限文件名),然後你又回到了使用a FOR循環,最好在批處理文件中。我將xml.exe驗證遷移到FOR循環中。如果需要,您可以恢復將結果輸送到批次中。即使文件名中有空格,此解決方案也可以工作。我使用EOL=:以防萬一文件名以;開頭,極不可能,但可能。

@echo off 
setlocal enableDelayedExpansion 
for /f "eol=: delims=" %%A in ('xml val *.xml') do (
    set "ln=%%A" 
    if "!ln:~-7!" == "invalid" (>>invalidXML.txt echo !ln:0,~-10!) else echo !ln:0,~-8! is valid 
) 

如果文件名包含!,那麼名字將被set "ln=%%A"由於延遲擴展損壞。解決方法是在循環中開啓和關閉延遲擴展

@echo off 
setlocal disableDelayedExpansion 
for /f "eol=: delims=" %%A in ('xml val *.xml') do (
    set "ln=%%A" 
    setlocal enableDelayedExpansion 
    if "!ln:~-7!" == "invalid" (>>invalidXML.txt echo !ln:0,~-10!) else echo !ln:0,~-8! is valid 
    end local 
) 
相關問題