有一些避免^
轉義序列的方法。
您可以使用延遲擴展的變量。下面是一個小批量腳本演示
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!
或者你可以使用FOR/F循環。在命令行:
for /f "delims=" %A in ("<html>") do @echo %~A
或批處理腳本:
@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A
的原因,這些方法的工作,因爲這兩個延遲擴展和FOR變量擴展特殊的運營商如<
,>
,&
發生後, |
,&&
,||
被解析。有關更多信息,請參閱How does the Windows Command Interpreter (CMD.EXE) parse scripts?。
sin3.14 points out that pipes may require multiple escapes。例如:
echo ^^^<html^^^>|findstr .
管需要多個逸出的原因是因爲在管的每一側在一個新的CMD處理被執行的,所以線被解析多次。請參閱Why does delayed expansion fail when inside a piped block of code?以瞭解Window管道實施的許多令人尷尬的後果。
還有一種避免使用管道時出現多次轉義的方法。你可以明確實例自己的CMD進程,保護與報價單逃生:
cmd /c "echo ^<html^>"|findstr .
如果您想使用延遲擴展技術,以避免逃逸,那麼還有更驚喜(您可能不若感到驚訝你是CMD.EXE設計方面的專家,但沒有官方的MicroSoft文檔可以解釋這個東西)
請記住,管道的每一邊都在其自己的CMD.EXE進程中執行,但該進程確實是不是繼承延遲擴展狀態 - 它默認爲OFF。因此,您必須明確實例化您自己的CMD.EXE進程並使用/ V:ON選項啓用延遲擴展。
@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .
請注意,父批處理腳本中的延遲擴展爲OFF。
但是,如果在父腳本中啓用了延遲擴展,則所有地獄狀態都會打散。下面確實不工作:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .
的問題是,!test!
在父腳本擴展,所以新的CMD進程試圖解析未受保護<
和>
。
你可以逃過!
,但這可能會變得棘手,因爲它取決於!
是否被引用。
如果沒有報價,然後雙擊逃逸是必需的:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .
如果引用,那麼單個逃生時:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .
但有避免所有逃脫一個令人驚訝的絕招 - 封閉管道的左側防止父腳本過早地擴展!test!
:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .
但我想即使這不是免費的午餐,因爲當使用括號時,批解析器會在末尾引入一個額外的(可能不需要的)空間。
批次是不是沒有樂趣的腳本;-)
報價有什麼問題? – Oskar 2008-10-30 20:10:02
引號也會被回顯。 – dalle 2008-10-30 20:12:05