DOS toplu iş dosyasında birden çok satırı yorumlama


98

Büyük MS DOS Batch dosyası yazdım. Bu toplu iş dosyasını test etmek için yalnızca bazı satırları yürütmem gerekiyor ve kalan satırları gizlemek / yorum yapmak istiyorum.

Bazı mevcut yorum satırlarım var, ::bu nedenle ::tüm yorumları karıştıracağından artık kullanamıyorum .

Bu sorunu nasıl çözebilirim?

Yanıtlar:


186

gotoKodu atlamak için a kullanabilirsiniz .

goto comment
...skip this...
:comment

11
+1: Bunun için "goto" kullanmak komik VE işe yarıyor!
rap-2-h

1
Bence komik olan, komut satırında gerçek bir yorum tanımı olmaması, sadece REMsatırları yorum satırı olarak kabul edemiyorum , bu çıktıyı belirsiz hale getiriyor
mkb

126

GOTO kullanmak yerine her satırın başına REM eklemek istiyorsanız, aşağıdaki adımları izleyerek bunu kolayca yapmak için Notepad ++ kullanabilirsiniz:

  1. Satır bloğunu seçin
  2. Ctrl-Q'ya basın

Açıklamayı kaldırmak için adımları tekrarlayın


6
Güzel ipucu. onu çok daha temiz hale getirir.
Venom

1
Vay canına, notepad ++ 'nın bu kadar güzel bir özelliği olduğunu bilmiyordum! Aslında gerçekten kaçırdım çünkü Eclipse'te Ctrl + 7'ye alışkınım. 42'ye kadar oy verildi ;)
Danny Lo

1
Ya uncomment? Orada tüm bloğun açıklamasını kaldırmak için herhangi bir kısayol.
Bhaskar Singh

2
@BhaskarSingh Notepad ++ 7.5.6'dan itibaren, sadece önceden yorumlanmış metni vurgulayabilirsiniz; "Ctrl + Q" komutunu yapın ve yorumunu kaldıracak
CreativiTimothy

Beyin mayın hatırlamak gibi genellikle zayıfsa Ctrl-Q, tıklayın Notepad++: Edit -> Comment/Uncomment.
Timo

13
break||(
 code that cannot contain non paired closing bracket
)

İken gotoçözüm iyi bir seçenektir o iş olmaz parantez içinde (komutlar İÇİN ve IF dahil) .Ama bu irade. Yine de, ayrıştırılacakları için köşeli parantezleri ve geçersiz sözdizimi FORve IFkomutları konusunda dikkatli olmalısınız .

Güncelleme

Dbenham'ın cevabındaki güncelleme bana bazı fikirler verdi. Birincisi - çok satırlı yorumlara ihtiyaç duyabileceğimiz iki farklı durum vardır - GOTO'nun kullanılamadığı bir parantez bağlamında ve dışında. Executed.Though kod Thede hala işlenecek ve bazı sözdizimi hataları (algılanır olmasını kodu engelleyen bir durum var eğer iç parantez bağlam başka parantez kullanabilirsiniz FOR, IF, yanlış kapalı parantez, yanlış parametre genişletme ..). So Mümkünse, GOTO kullanmak daha iyidir.

Etiket olarak kullanılan bir makro / değişken oluşturmak mümkün olmasa da, parantezin yorumları için makroları kullanmak mümkündür. Yine de iki numara GOTO yorumlarını daha simetrik ve daha hoş hale getirmek için kullanılabilir (en azından benim için). Bunun için iki numara kullanacağım - 1) Bir etiketin önüne tek bir sembol koyabilirsiniz ve goto onu yine de bulabilir (bunun neden olduğu hakkında hiçbir fikrim yok, sanırım bir sürücü arıyor). 2): değişken adının sonuna bir single koyabilirsiniz ve değiştirme / çıkarma özelliği tetiklenmeyecektir (etkin uzantılar altında bile). Parantez açıklamaları için makrolarla birleştirildiğinde, her iki durumun neredeyse aynı görünmesini sağlayabilir.

İşte örnekler (en sevdiğim sırayla):

İle dikdörtgen parantez :

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

İle süslü parantez :

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

İle parantez :

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

Powershell ve C stilleri arasındaki karışım ( <yeniden yönlendirme daha yüksek *öncelikli olduğu için kullanılamaz . Bu nedenle kullanılamaz %*):

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

To emphase o bir yorumun (o kadar kısa değil düşünce):

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

1
Bunun yerine rem.||(veya kullanabilirsiniz rem^ (. Niyet biraz daha net. Güncellenen cevabıma bakın.
dbenham

@dbenham - evet rem ile daha kısa.
npocmaka

1
Ooh, kare ve kıvrık parantez formları seksi. Yalnızca kendim için kod yazıyor olsaydım onu ​​kullanabilirdim. Ama ortalama bir kullanıcının bunu göreceğini ve WTF diyeceğini tahmin ediyorum.
dbenham

@dbenham - haklı olabilirsin. çekiciliğini kaybetmesine rağmen daha belirgin hale getirmek için %rem:%+ %:rem%formunu da ekleyebilirim veya sadece C-stiline daha yakın olmak için eğik çizgi ...
npocmaka

1
@npocmaka Bu harika! Ne yaptığınızı anlarken bir sürü toplu komut dosyası incelemesi öğrendim. Bildiğim tüm blok yorum yöntemlerinden (toplu iş için), bu en sağlam ve zekice görünüyor.
Kesmek

10

Başka bir seçenek, istenmeyen satırları asla doğru olamayacak bir IF bloğunun içine almaktır.

if 1==0 (
...
)

Elbette if bloğunun içindeki hiçbir şey çalıştırılmayacak, ancak ayrıştırılacaktır. Yani içinde geçersiz sözdiziminiz olamaz. Ayrıca, )öncelenmedikçe veya alıntı yapılmadıkça yorum içeremez . Bu nedenlerle, kabul edilen GOTO çözümü daha güvenilirdir. (GOTO çözümü ayrıca daha hızlı olabilir)

Güncelleme 2017-09-19

İşte pdub'ın GOTO çözümüne yönelik kozmetik bir iyileştirme . GOTO yorum sözdizimini kendi kendine belgelemeyi biraz daha iyi hale getiren basit bir ortam değişkeni "makro" tanımlıyorum. Genel olarak şu önerilmektedir: etiketler bir toplu komut dosyası içinde benzersizdir, bunun gibi birden çok yorumu aynı toplu komut dosyası içinde gömmek gerçekten sorun değildir.

@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

Veya npocmaka'nın çözümünün bu varyantlarından birini kullanabilirsiniz . BREAK yerine REM kullanımı, amacı biraz daha netleştirir.

rem.||(
   remarks
   go here
)

rem^ ||(
   The space after the caret
   is critical
)

1

Sadece pdub'ın GOTO çözümünün tam olarak doğru olmadığını belirtmek isterim : yorum etiketi birden çok kez görünür. Bu sorudaki kodu örnek olarak değiştiriyorum .

@ECHO OFF
SET FLAG=1
IF [%FLAG%]==[1] (
    ECHO IN THE FIRST IF...
    GOTO comment
    ECHO "COMMENT PART 1"
:comment
    ECHO HERE AT TD_NEXT IN THE FIRST BLOCK
)

IF [%FLAG%]==[1] (
    ECHO IN THE SECOND IF...
    GOTO comment
    ECHO "COMMENT PART"
:comment
    ECHO HERE AT TD_NEXT IN THE SECOND BLOCK
)

Çıktı olacak

IN THE FIRST IF...
HERE AT TD_NEXT IN THE SECOND BLOCK

İLK BLOKTA TD_NEXT AT ECHO komutu atlanır.


0

@jeb

Ve bunu kullandıktan sonra, stderr erişilemez görünüyor

Hayır, şunu dene:

@echo off 2>Nul 3>Nul 4>Nul

   ben ali  
   mubarak 2>&1
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

Ama neden işe yarıyor?

üzgünüm, soruyu frensh içinde cevaplıyorum:

(la redirection par 3> en özel araba elle persiste, on va l'utiliser pour capturer le flux des erreurs 2> est on va le transformer en un flux persistant à l'ade de 3> ceci va nous permettre d'avoir une gestion des erreur notre environement de script..par la suite si on veux recuperer le flux 'stderr' il faute une autre redirection du handle 2> au handle 1> qui n'est autre que la console ..)


1
Fransızca okuyamıyorum, ancak ilk yeniden yönlendirme bittikten sonra akış 2'nin (stderr) neden devre dışı bırakılmaya devam ettiğini ele alamıyorsunuz. Dostips.com/forum/viewtopic.php?p=14612#p14612 adresinde arka arkaya 2 gönderide uygulanabilir bir teorim ve test durumlarım var .
dbenham

(3> ile yeniden yönlendirme özeldir çünkü devam eder, onu hataların akışını yakalamak için kullanacağız 2> 3'e kadar kalıcı bir akışa mı dönüştürecek> bu bizim herhangi birimiz için bir yönetim hatası almamıza izin verecektir. ortam betiği .. o zaman eğer 'stderr' akışını kurtarmak istiyorsanız, konsoldan başka bir şey olmayan bir> işlemek için başka bir tutamaç yönlendirmesi 2>
yapmalıyız

-1

bunu dene:

   @echo off 2>Nul 3>Nul 4>Nul

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

+1, Peki neden işe yarıyor? Ve bu kullandıktan sonra stderr ulaşılmaz gibi görünüyor
Jeb

1
-1, Bu "çalışır" çünkü echo 2> Nul, standart hata akışını NUL'a yeniden yönlendiriyor, gömüyor (3> Nul, 4> Nul, yardımcı akışları gerçek bir sebep olmadan yeniden yönlendiriyor). Bu, satırları yorumlamaz, yalnızca hata mesajlarının gösterilmesini engeller. Böylece komut satırı olarak yorumlanabilecek her şey çalışmaya devam edecektir.
pdubs

3
pdubs yorumu, komutların hala yürütülmesi (ve geçerli olmadığı için başarısız olması) nedeniyle kısmen doğrudur. Ancak geçerli komutlar, hatasız yürütülür. Dolayısıyla bu, kod satırlarını yorumlamak için iyi bir çözüm değildir. Akış 2'nin (stderr) neden "kalıcı olarak" devre dışı bırakıldığının açıklaması doğru değildir.
dbenham

3
Windows toplu işleminde yeniden yönlendirmenin nasıl çalıştığına dair bir teorim var ve bu yanıtta stderr'in neden "kalıcı olarak" devre dışı bırakıldığını açıklıyor. Teori ve testler dostips.com/forum/viewtopic.php?p=14612#p14612
dbenham
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.