我寫了大量的MS DOS批處理文件。爲了測試這個批處理文件,我只需要執行一些行,並想隱藏/註釋掉剩下的部分。在DOS批處理文件中註釋多行
我有一些現有的註釋行開頭::因此我不能再使用::因爲它會攪亂所有評論。
在這方面的任何幫助將不勝感激。 在此先感謝, Jay
我寫了大量的MS DOS批處理文件。爲了測試這個批處理文件,我只需要執行一些行,並想隱藏/註釋掉剩下的部分。在DOS批處理文件中註釋多行
我有一些現有的註釋行開頭::因此我不能再使用::因爲它會攪亂所有評論。
在這方面的任何幫助將不勝感激。 在此先感謝, Jay
您可以使用goto
跳過代碼。
goto comment
...skip this...
:comment
試試這個:
@echo off 2>Nul 3>Nul 4>Nul
ben ali
mubarak
gadeffi
..next ?
echo hello Tunisia
pause
@jeb
並使用此之後,標準錯誤似乎是不可訪問
沒有,試試這個:
@echo off 2>Nul 3>Nul 4>Nul
ben ali
mubarak 2>&1
gadeffi
..next ?
echo hello Tunisia
pause
但它爲什麼有效?
對不起,我回答frensh問題:
(LA重定向標準桿3> EST專用車ELLE persiste,在VA L'utiliser倒俘獲樂宮通量上erreurs VA樂變壓器連接聯合國2> EST flux persistantàl'ade de 3> ceci va nous permettre d'avoir une gestion des erreur pour tout notre environement de script.Par la suite si on veux recuperer le flux'stderr'il faut faire une autre redirection du handle 2 > au handle 1> qui n'est autre que la console ..)
另一種選擇是將不需要的行放在一個不可能爲真的IF塊中
if 1==0 (
...
)
當然,if塊中沒有內容會被執行,但它會被解析。所以你不能有任何無效的語法。另外,註釋不能包含)
,除非它被轉義或引用。由於這些原因,公認的GOTO解決方案更可靠。 (該溶液GOTO也可能更快)
更新2017年9月19日
這裏是化妝品增強pdub's GOTO solution。我定義了一個簡單的環境變量「macro」,它使GOTO註釋語法更好一些。儘管通常建議:標籤在批處理腳本中是唯一的,但在同一批處理腳本中嵌入多個註釋是確實可以的。
@echo off
setlocal
set "beginComment=goto :endComment"
%beginComment%
Multi-line comment 1
goes here
:endComment
echo This code executes
%beginComment%
Multi-line comment 2
goes here
:endComment
echo Done
或者您可以使用npocmaka's solution這些變體之一。使用REM而不是BREAK使意圖更清晰一些。
rem.||(
remarks
go here
)
rem^ ||(
The space after the caret
is critical
)
如果你想在每行開頭添加REM,而不是使用GOTO的,可以用記事本++做到這一點很容易以下步驟:
重複步驟以取消
break||(
code that cannot contain non paired closing bracket
)
雖然goto
解決方案是一個不錯的選擇,但它不會工作within brackets(包括FOR和IF命令)。但這會。儘管您應該小心關閉括號和FOR
和IF
命令的無效語法,因爲它們將被解析。
更新
在dbenham's答案的更新給了我一些想法。 首先 - 有兩種不同的情況,我們可能需要多行註釋 - 在括號的上下文中,GOTO不能使用並且在其外部。 如果有一個條件阻止代碼被執行,那麼我們可以使用另一個括號。雖然代碼仍然會被解析 並且會檢測到一些語法錯誤(FOR
,IF
,括號不正確,參數展開錯誤。 )如果有可能,最好使用GOTO。
儘管不可能創建用作標籤的宏/變量,但可以使用宏作爲括號的註釋。儘管可以使用兩個技巧使得註釋更加對稱和更令人愉悅(至少對於我)。爲此,我將使用兩個技巧 - 1)您可以在標籤前放一個符號,goto仍然可以通過 找到它(我不知道爲什麼是這樣。我的想法是它正在尋找一個驅動器)。 2)您可以將一個單獨的:
置於變量名的末尾,替換/子串功能將不會被觸發(即使在啓用的擴展下)。結合宏的括號註釋可以使 使這兩種情況看起來幾乎相同。
因此,這裏的例子(順序我最喜歡他們):
隨着矩形支架:
@echo off
::GOTO comment macro
set "[:=goto :]%%"
::brackets comment macros
set "[=rem/||(" & set "]=)"
::testing
echo not commented 1
%[:%
multi
line
comment outside of brackets
%:]%
echo not commented 2
%[:%
second multi
line
comment outside of brackets
%:]%
::GOTO macro cannot be used inside for
for %%a in (first second) do (
echo first not commented line of the %%a execution
%[%
multi line
comment
%]%
echo second not commented line of the %%a execution
)
隨着大括號:
@echo off
::GOTO comment macro
set "{:=goto :}%%"
::brackets comment macros
set "{=rem/||(" & set "}=)"
::testing
echo not commented 1
%{:%
multi
line
comment outside of brackets
%:}%
echo not commented 2
%{:%
second multi
line
comment outside of brackets
%:}%
::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
echo first not commented line of the %%a execution
%{%
multi line
comment
%}%
echo second not commented line of the %%a execution
)
隨着括號:
@echo off
::GOTO comment macro
set "(:=goto :)%%"
::brackets comment macros
set "(=rem/||(" & set ")=)"
::testing
echo not commented 1
%(:%
multi
line
comment outside of brackets
%:)%
echo not commented 2
%(:%
second multi
line
comment outside of brackets
%:)%
::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
echo first not commented line of the %%a execution
%(%
multi line
comment
%)%
echo second not commented line of the %%a execution
)
混合物C之間的powershell和樣式(<
不能使用,因爲重定向是具有較高PRIO。*
不能使用,因爲的%*
):
@echo off
::GOTO comment macro
set "/#:=goto :#/%%"
::brackets comment macros
set "/#=rem/||(" & set "#/=)"
::testing
echo not commented 1
%/#:%
multi
line
comment outside of brackets
%:#/%
echo not commented 2
%/#:%
second multi
line
comment outside of brackets
%:#/%
::GOTO macro cannot be used inside for loop
for %%a in (first second) do (
echo first not commented line of the %%a execution
%/#%
multi line
comment
%#/%
echo second not commented line of the %%a execution
)
要emphase這是一個註釋(認爲它不是那麼短):
@echo off
::GOTO comment macro
set "REM{:=goto :}REM%%"
::brackets comment macros
set "REM{=rem/||(" & set "}REM=)"
::testing
echo not commented 1
%REM{:%
multi
line
comment outside of brackets
%:}REM%
echo not commented 2
%REM{:%
second multi
line
comment outside of brackets
%:}REM%
::GOTO macro cannot be used inside for
for %%a in (first second) do (
echo first not commented line of the %%a execution
%REM{%
multi line
comment
%}REM%
echo second not commented line of the %%a execution
)
謝謝主席先生! – user219628 2011-12-15 23:01:53
+1:爲此使用「goto」很有趣,它工作正常! – 2013-11-26 10:20:07
我覺得有趣的是,在命令行中沒有真正的註釋定義,我不能接受'REM'行作爲註釋行,它使輸出變得模糊 – mkb 2017-10-25 04:18:41