2011-12-15 12 views
66

He escrito un gran 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.Comentando varias líneas en el archivo de proceso por lotes de DOS

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 de antemano, Jay

Respuesta

129

Puede omitir el código usando goto.

goto comment 
...skip this... 
:comment 
+0

Gracias señor! – user219628

+5

+1: ¡Es divertido usar "goto" para esto Y funciona! –

+0

Creo que lo curioso es que no hay definición comentario real en la línea de comandos, simplemente no puedo aceptar 'líneas REM' como líneas de comentario, que hace que la salida oscura – mkb

-1

probar esto:

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

    ben ali 
    mubarak 
    gadeffi 
    ..next ? 

    echo hello Tunisia 

    pause 
+0

1, pero por qué funciona? Y después de esto, el stderr parece ser inaccesible – jeb

+1

-1, este "obras" porque echo 2> Nul está redirigiendo el flujo de error estándar para NUL, enterrándolo (los 3> Nul, 4> Nul a redirigir los flujos auxiliares para ningún razón real). Esto no hace comentarios sobre las líneas, simplemente evita que se muestren los mensajes de error. Entonces cualquier cosa que pueda ser interpretada como líneas de comando seguirá ejecutándose. – pdubs

+3

El comentario de pdubs es parcialmente correcto porque los comandos todavía se están ejecutando (y fallando porque no es válido). Pero los comandos válidos se ejecutarían sin fallas. Entonces esta no es una buena solución para comentar líneas de código. La explicación de por qué la secuencia 2 (stderr) está desactivada "permanentemente" no es correcta. – dbenham

0

@jeb

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

No, intente 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, mi respuesta a la pregunta en Frensh:

(la redirección par 3> est elle Spécial coche Persiste, on va l'utiliser verter capturador le des flujo Erreurs 2> EST el transformador va le estado un fin persistencia de flujo a la certeza 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 ..)

+1

No puedo leer francés, pero no se parece a abordar la razón por la corriente 2 (stderr) continúa deshabilitado después de que finaliza la redirección inicial. Tengo una teoría viable y casos de prueba en 2 publicaciones consecutivas en http://www.dostips.com/forum/viewtopic.php?p=14612#p14612. – dbenham

+0

(redirección de 3> es especial porque persiste, lo vamos a utilizar para capturar el flujo de errores 2> es que lo convertirá en un flujo persistente de ADE de 3> Esto nos permitirá tener un error de gestión para cualquiera de nuestro script de entorno ... luego, si quieres recuperar el flujo 'stderr', debemos hacer otro manejador de redirección 2> para manejar a> que no es otro que la consola ..) – user96403

9

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

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ápido)

actualización 2017-09-19

Aquí es una mejora estética a pdub's GOTO solution. 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 usted podría utilizar una de estas variantes de npocmaka's solution. 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 
) 
90

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

  1. seleccionar el bloque de líneas
  2. pulse Ctrl-Q

Repita los pasos para eliminar el comentario

+3

Nice tip. lo hace mucho más limpio. – Venom

+0

Wow, no sabía Notepad ++ tiene una característica tan agradable! Realmente realmente lo extrañé porque estoy acostumbrado a 'Ctrl + 7' en Eclipse. Votado hasta ** 42 **;) –

+0

¿Qué pasa con el comentario? Hay un atajo para descomentar todo el bloque. –

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

Si bien la solución goto es una buena opción, no funcionará within brackets (incluidos los comandos FOR e IF). Pero esto lo hará. Aunque debe tener cuidado con el cierre de corchetes y la sintaxis no válida para los comandos FOR y IF, ya que se analizarán.

actualización

La actualización de la respuesta dbenham's me dio algunas ideas. Primero, 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 fuera de él. En el contexto de corchetes internos podemos usar otros corchetes si hay una condición que impide que se ejecute el código. Aunque el código thede aún se analizará y se detectarán algunos errores de sintaxis (FOR, IF, corchetes incorrectamente cerrados, expansión incorrecta de parámetros. .). 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 comentarios de corchetes. Hasta dos trucos se pueden usar para hacer los comentarios GOTO más simétricos y más agradables (al menos para yo). Para esto voy a utilizar dos trucos - 1) puedes poner un solo símbolo en frente de una etiqueta y goto todavía podrá para encontrarlo (no tengo ni idea de por qué es esto. Mi guues está buscando una unidad) 2) puede 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 les gusta más):

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 pueden utilizar debido a que la redirección es con mayor prio.* no se pueden utilizar 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 
) 

Para EMPHASE que es un comentario (pensamos que no es tan corta):

@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

Se podría usar '|| rem (' 'reales o^(' en lugar La intención es un poco más claro Véase mi respuesta actualizada – dbenham

+0

@dbenham -.... Eso sí con REM es más corto – npocmaka

+1

Ooh, las formas de corchete y rizado. Si estuviera escribiendo código solo para mí, podría usarlo. Pero me imagino que el usuario promedio lo vería y diría WTF. – dbenham

Cuestiones relacionadas