2017-04-13 32 views
1

無法在批處理文件中的引號內跳過分號我正在通過批處理操作一些HTML。我正在使用延遲擴展,但在雙引號內遇到分號時,腳本無法在分號之後複製任何內容。使用enableDelayedExpansion

這可能是由於這樣的事實,我使用雙引號時,我傳遞變量到putLineInHTMLFile標籤(我需要保持標籤分離的東西)。

@echo off 
setlocal enableDelayedExpansion 
del output.html 
for /f "delims=" %%x in (file.html) do call :putLineInHTMLFile "%%x" 
goto :EOF 
:putLineInHTMLFile 
set "line=%~1" 
echo !line!>> output.html 

file.html包含:

<tag1> 
<tag"bla;2"> 

腳本運行之後,output.html包含:

<tag1> 
<tag"bla 

我試着^或^^逃離分號。沒有工作。我試過也逃避雙引號。那也行不通。

無論如何,我可以改變file.html的內容,只要我可以在輸出文件中包含該分號即可。

回答

2

這似乎適用於給定的測試案例;爲更廣泛地使用無擔保:

@echo off 
setlocal enableDelayedExpansion 
del output.html 
for /f "delims=# tokens=*" %%x in (file.html) do (
     set "safe=%%x" 
     set "safe=!safe:"=""!" 
     call :putLineInHTMLFile "!safe!" 
) 
goto :eof 
:putLineInHTMLFile 
set "line=%~1" 
set "line=%line:""="%" 
echo !line!>> output.html 
:eof 

內的for命令的「身體」,該%%x沒有分裂,當由call命令,出現這種情況處理它的唯一。爲了保護這一點,我使用safe將字符串中的所有雙引號加起來,然後在子例程中添加一行以再次去除它們。

如果雙引號不匹配,這將無法正常工作,但在這種情況下,即使沒有出現分號,也不會跟蹤尾部>的回顯。

1

當然可以。問題是,該子例程接收

「<標籤」 BLA; 2 「>」

爲該線路。解析器看到,隨着

TOKEN1: 「<標籤」 BLA
Token2:2 「>」

因爲;空間是一個隔板。不幸的是,不知道你打算在子程序中做什麼,很難就如何規避問題提出建議。


@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q43391363.txt" 
SET "outfile=%destdir%\outfile.txt" 
SET "outfile2=%destdir%\outfile2.txt" 
del "%outfile%" 
del "%outfile2%" 

(for /f "delims=" %%x in (%filename1%) do set "line=%%x"&call :putLineInHTMLFile "%%x")>"%outfile2%" 
goto :eof 

:putLineInHTMLFile 
ECHO %* 
echo !line!>>"%outfile%" 

GOTO :EOF 

你需要改變的sourcedirdestdir設置以適合你的情況。 我使用了一個名爲q43391363.txt的文件,其中包含我的測試數據。

主要生產定義爲%OUTFILE%和%outfile2%

所以文件 - 這裏有兩種不同的方式,一種是使用傳統的輸出直接向outfile1,另一個使用重定向從子程序到outfile2

+0

我正在建立一個來自多個其他來源的HTML文件,包括其他兩個包含頁腳和頁眉的HTML文件。有什麼辦法可以逃脫分號嗎?我可以修改頁腳和標題「HTML」文件,因爲它們不是真正的HTML。他們是我可以隨意操作的文本。 – Axonn

1

此方法適用於所有的情況下,只要報價匹配輸入線(偶數):

@echo off 
setlocal enableDelayedExpansion 
del output.html 
for /f "delims=" %%x in (file.html) do call :putLineInHTMLFile "%%x" 
goto :EOF 

:putLineInHTMLFile 
set line=%* 
echo !line:~1,-1!>> output.html 

PS - 請,不包括未出現在original code其他部分,像:eof標籤...該標籤用goto :EOF命令中的大寫字母書寫,以指示它是特殊的。請輸入goto /?瞭解更多詳情。

+0

明白了。我編輯了我原來的帖子。謝謝你在這一切的幫助:)。 – Axonn

相關問題