2008-10-30 63 views
77

我需要將包含尖括號(<和>)的字符串回顯到Windows計算機上的文件。基本上我想要做的是以下幾點:
echo some string < with angle > brackets >>myfile.txtWindows命令提示符中的退出尖括號

這不起作用,因爲命令解釋程序與尖括號混淆。我可以引用這樣的整個字符串:
echo "some string < with angle > brackets" >>myfile.txt

但是,然後我在我的文件中有雙引號,我不想要。

擺脫支架翼UNIX無法正常工作或:
echo some string \< with angle \> brackets >>myfile.txt

想法?

+0

報價有什麼問題? – Oskar 2008-10-30 20:10:02

+3

引號也會被回顯。 – dalle 2008-10-30 20:12:05

回答

138

出於某種原因,Windows轉義字符是^。

echo some string ^< with angle ^> brackets >>myfile.txt 
+8

好吧,反斜槓用於路徑名,雙引號是用來包裝具有空格的文件名,所以沒有多少字符選擇。 – 2008-10-30 20:27:57

+0

這也適用於&符號(&)等其他字符,謝謝。 – tenfour 2011-02-23 17:20:21

+2

非常棒! `回顯一些字符串^ <帶有角度^>括號>> con`結果爲: _some string 括號_ – 2011-06-16 14:33:12

0

逃離ALA UNIX括號不 工作之一:

呼應一些字符串\ <與 角度\>括號>> myfile.txt複製

反斜槓會被視爲絕對路徑名的開始。

-2

您還可以使用雙引號來轉義特殊字符...

echo some string "<" with angle ">" brackets >>myfile.txt 
23

真,官方轉義字符是^,而是因爲有時你需要 ^字符要小心。這僅僅是有時

C:\WINDOWS> echo ^<html^> 
<html> 

C:\WINDOWS> echo ^<html^> | sort 
The syntax of the command is incorrect. 

C:\WINDOWS> echo ^^^<html^^^> | sort 
<html> 

C:\WINDOWS> echo ^^^<html^^^> 
^<html^> 

一招了這麼多廢話的是使用其他的命令比echo來做輸出和引號用雙引號:

C:\WINDOWS> set/p _="<html>" <nul 
<html> 
C:\WINDOWS> set/p _="<html>" <nul | sort 
<html> 

請注意,這不會保留提示文字上的前導空格。

5

有一些避免^轉義序列的方法。

您可以使用延遲擴展的變量。下面是一個小批量腳本演示

@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 . 

但我想即使這不是免費的午餐,因爲當使用括號時,批解析器會在末尾引入一個額外的(可能不需要的)空間。

批次是不是沒有樂趣的腳本;-)

1

爲了使用特殊字符,如「>」 Windows上與之呼應,你需要在它之前放置一個特殊的轉義字符。

例如

echo A->B 

將沒有工作,因爲 '>' 必須通過 '^' 進行轉義:

echo A-^>B 

escape sequences見。 enter image description here

有一個短的批處理文件,它打印一組基本的特殊字符及其轉義序列。