Pregunta Comentando múltiples líneas en el archivo por lotes de DOS


He escrito un enorme archivo por lotes de MS DOS. Para probar este archivo por lotes, necesito ejecutar solo algunas líneas y quiero ocultar / comentar lo que queda.

Tengo algunas líneas de comentarios existentes que comienzan con :: por lo tanto, no puedo usar :: más, ya que codificará todos los comentarios.

Cualquier ayuda en este sentido será apreciada. Gracias por adelantado, Arrendajo


73
2017-12-15 21:36


origen


Respuestas:


Puedes usar un goto omitir el código

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

140
2017-12-15 21:39



Si desea agregar REM al comienzo de cada línea en lugar de usar GOTO, puede utilizar Notepad ++ para hacerlo fácilmente siguiendo estos pasos:

  1. Seleccione el bloque de líneas
  2. presionar Ctrl-Q

Repita los pasos para descomentar


95
2017-07-12 18:54



Otra opción es encerrar las líneas no deseadas en un bloque IF que nunca puede ser cierto

if 1==0 (
...
)

Por supuesto, no se ejecutará nada dentro del bloque if, pero se analizará. Entonces no puedes tener ninguna sintaxis inválida dentro. Además, el comentario no puede contener ) a menos que sea escapado o citado. Por esas razones, la solución GOTO aceptada es más confiable. (La solución GOTO también puede ser más rápida)

Actualización 2017-09-19

Aquí hay una mejora cosmética para la solución GOTO de pdub. Defino una variable de entorno simple "macro" que hace que la sintaxis de comentario de GOTO sea un poco mejor auto documentada. Aunque generalmente se recomienda que: las etiquetas sean únicas dentro de un script por lotes, realmente está bien insertar varios comentarios como este dentro del mismo script por lotes.

@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

O podrías usar una de estas variantes de La solución de npocmaka. El uso de REM en lugar de BREAK hace que la intención sea un poco más clara.

rem.||(
   remarks
   go here
)

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

10
2017-12-16 17:14



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

Mientras que la goto la solución es una buena opción, no funcionará entre paréntesis (incluidos los comandos FOR e IF). Pero esto lo hará. Aunque debe tener cuidado al cerrar corchetes y sintaxis inválida para FOR y IF comandos porque serán analizados

Actualizar

La actualización en el dbenham la respuesta me dio algunas ideas. En primer lugar, hay dos casos diferentes en los que podemos necesitar comentarios de varias líneas, en el contexto de un corchete donde GOTO no se puede usar y está fuera de él. Dentro del contexto de corchetes podemos usar otros corchetes si hay una condición que impide que se ejecute el código. Aunque el código seguirá siendo analizado y se detectarán algunos errores de sintaxis (FOR,IF , corchetes incorrectamente cerrados, expansión de parámetros incorrecta ...). Entonces, si es posible, es mejor usar GOTO.

Aunque no es posible crear una macro / variable utilizada como etiqueta, pero es posible usar macros para los comentarios de corchetes. Hasta dos trucos se pueden usar para hacer GOTO. comentarios más simétricos y más agradables (al menos para mí). Para esto usaré dos trucos - 1) puedes poner un solo símbolo delante de una etiqueta y goto todavía podrá para encontrarlo (no tengo idea de por qué es esto. Mi guasa es buscar un disco). 2) puedes poner un solo :  al final de un nombre de variable y una función de reemplazo / subcadena no se activará (incluso en las extensiones habilitadas). Lo cual combinado con las macros para comentarios de paréntesis puede hacer que los dos casos se vean casi iguales.

Así que aquí están los ejemplos (en el orden que más me gusta):

Con soportes rectangulares:

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

Con llaves:

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

Con paréntesis:

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

Mezcla entre powershell y C estilos (< no se puede usar porque la redirección es con prio superior.* no se puede usar debido a la %*)

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

A emphase eso es un comentario (pensó que no es tan corto):

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

10
2018-02-15 01:58



@jeb

Y después de usar esto, el stderr parece ser inaccesible

No, prueba esto:

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

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

   echo hello Tunisia

  pause

Pero, ¿por qué funciona?

lo siento, respondo la pregunta en frensh:

(la redirection par 3> est spécial car 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 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 consola.. )


0
2017-12-16 11:21



prueba esto:

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

   ben ali
   mubarak
   gadeffi
   ..next ?

   echo hello Tunisia

  pause

-1
2017-12-16 08:35