batch-file - lotes - echo off bat
Comentando mĂșltiples lĂneas en el archivo por lotes de DOS (6)
@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 deserreur 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 ..)
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 de antemano, Jay
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 )
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 a 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
)
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:
- Seleccione el bloque de líneas
- presionar Ctrl-Q
Repita los pasos para descomentar
prueba esto:
@echo off 2>Nul 3>Nul 4>Nul
ben ali
mubarak
gadeffi
..next ?
echo hello Tunisia
pause
Puede usar un goto
para omitir el código.
goto comment
...skip this...
:comment
break||(
code that cannot contain non paired closing bracket
)
Si bien la solución goto
es una buena opción, no funcionará entre corchetes (incluidos los comandos FOR e IF). Pero esto lo hará. Aunque debe tener cuidado al cerrar corchetes y sintaxis inválida para los comandos FOR
e IF
porque se analizarán.
Actualizar
La actualización en la respuesta dbenham''s 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 thede aún será analizado y se detectarán algunos errores de sintaxis ( FOR
, IF
, corchetes incorrectamente cerrados, expansión incorrecta de parámetros ...) Así que 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 pueden usarse para hacer los comentarios de GOTO más simétricos y más agradables (al menos para mí). Para esto voy a usar dos trucos: 1) puedes poner un solo símbolo delante de una etiqueta y goto todavía podrá encontrarlo (no tengo idea de por qué es esto. Mi argumento es que 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 corchetes 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 estilos C ( <
no se puede usar porque la redirección es con prio superior. *
No se puede usar debido al %*
):
@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 enfatizar ese 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
)